Wanted: Wiki Lists (dot org)

Something I'd like to see:

A site that maintains all the world's 'lookup tables.'

Every lookup table you'll ever need, exposed in open, compatible and readily-consumable ways.

All lists can be retrieved as html or xml, as json, as csv (the one format guaranteed to outlive the cockroach), or any other commonly used** data format.

Lists at 'wiki lists' are more complete, more accessible, and much lighter-weight than the Lists at wikipedia.

The lists are crowd-sourced, contributed by anyone and curated by the detail-oriented masses. The faceless trainspotters and plane spotters, the aspies and cybrarians.

Lists that are currently shown in haphazard ways inside wikipedia could instead source their content from such wiki-lists.

Where a list can be reliably sourced from a canonical source, it is done so programmatically and the attribution provided in a standard way.

Example lists include...

  • Every sovereign nation
  • Their dialing code, currencies, major languages
  • The three letter codes for every airport, landing strip and helipad in the world
  • The name and abbreviation of every state in the united states (and every other nation)
  • Zip codes and postal codes
  • Monarchs of England
  • Breeds of dog
  • Keywords in C
  • Mayors of southhampton
  • Notes in F major pentatonic
  • Winners of the Belgian grand prix
  • Stocks that trade on the NYSE

And a thousands other reference lists. Short lists. Information that changes slowly, slow enough for humans to curate it.

And they're the kind of lists that you (or someone like you) needs to reference in their applications and research all the time.

(See also this thread at Hacker News which prompted me to write down this idea I've thought for so long.)

** Note I said 'commonly used' rather than 'standard'. CSV is commonly used, but it doesn't have a standard. Oh you might point out that there are standards for CSV, and of course there are. Where there's standards, plural, there is no 'standard'.

 

DOS on Dope: The last MVC web framework you'll ever need

When you've done everything you can with Ruby On Rails....

When you've reached the limits of Haskell on a Horse...

If FubuMVC is not for you...

It's time to meet the MVC web framework to end all MVC Web frameworks.

DOS on DOPE is the modern MVC framework built on the awesome power of Batch scripts.

All of the controllers in DoD are batch files.

All of the views are batch files.

The model is based on batch files. The helper functions are... you guessed it! Beautiful batch files!

The complete source code and tutorials are available at github

With DosOnDope, it's this simple:

open a cmd window, and write:

dope site Blog

You just built a website, called 'blog'. Here it is:

dod_congrats

Oops. It moves too fast, I can't keep up.

Here's all the folders that have been created for us...

C:\temp\blog>dir /s/a:d/b
C:\temp\blog\Content
C:\temp\blog\Controllers
C:\temp\blog\h
C:\temp\blog\Models
C:\temp\blog\Scripts
C:\temp\blog\Views
C:\temp\blog\Controllers\Home
C:\temp\blog\Views\Shared

And all the files...

C:\temp\blog>dir /s/a:-d/b
C:\temp\blog\Default.aspx
C:\temp\blog\favicon.ico
C:\temp\blog\Global.asax
C:\temp\blog\web.config
C:\temp\blog\Content\Site.css
C:\temp\blog\Content\li.png
C:\temp\blog\Content\Logo.png
C:\temp\blog\Controllers\_actionMissing.bat
C:\temp\blog\Controllers\_controllerMissing.bat
C:\temp\blog\Controllers\Home\Index.bat
C:\temp\blog\h\a.bat
C:\temp\blog\h\h1.bat
C:\temp\blog\h\h2.bat
C:\temp\blog\h\h3.bat
C:\temp\blog\h\p.bat
C:\temp\blog\Models\split.vbs
C:\temp\blog\Views\Shared\_header.bat

Let's create a new controller action, and see how it looks.

dod_about_action

Let's improve the look of that page. You type a little...

dod_about_improved edit

...hit refresh and see what changed.

dod_about_improved view

It worked.

Notice the use of html helper methods like 'p.bat' and use of the partial, '_header.bat' to give styling and a title to the page.

But websites don't live in a vacuum. We need some data to bring this thing to life.

In DoD we embrace the NoSQL movement and jump straight to the data-store of the future: a CSV file.

C:\temp>CD Blog\Models
C:\temp\Blog\Models>copy con Posts.csv
ID`Title`Article
^Z

Posts.csv is both the model that describes our data, and the store which will contain the data itself.

Let's generate actions for administering our Posts:

C:\temp\blog\Models>dope gen Post
Generating actions for MODEL Post in Controller Home...

Check in a browser...

dod_home_adding

The generator has created a nice page for us, with a name and textbox for every field, so we can create new posts.

Once we've added a few articles, let's see what the index looks like:

dod_home_index 2

If we look inside the posts.csv file, we see the data:

C:\temp\blog\Models>type Posts.csv
ID`Title`Article
1`Hello Brazil!`Yes, yes, hello indeed!
2`Let's add a second for good measure`Oh yeah

Frequently Asked Questions

What about security?

If you can't trust public visitors from the internet, who can you trust? Executing user input as commands inside the operating system is the most direct way to get things done, and that's what matters most.

Does it scale?

So far I haven't run into any performance problems. Whenever I've opened up a DoD website to several users, my hard drive tends to get wiped long before I discover performance issues.

Well, that's about it. Source code and tutorials available at github / dos on dope

A full-featured web development framework with the smallest possible concept count.

Feedback welcome.

 

JSON Query Languages: 5 special purpose editors

A few weeks ago I put out a simple editor for SQLike.

Since then I've researched a bunch of other JSON Query Languages, and created similar editors for each of them.

Here's the full set:

What are they?

Plus, Minus, Interesting

Here's a quick PMI comparison of each of them.

"SQLike"

Thomas Frank's SQLike uses SQL-style JSON for Querying JSON. Try it.

PlusMinusInteresting
  • Most complete join syntax.
  • Uses a SQL metaphor rather than Linq metaphor, hence larger audience
  • Keywords like 'sum' need to be embedded in pipe characters.
  • Function syntax is a little ceremonious (compared to sql)
  • Query is structured as JSON rather than fluidic api

"JsLinq"

Chris Pietschmann's Linq to Javascript (JsLinq) uses Fluent javascript for Querying JSON. Try it.

PlusMinusInteresting
  • Most complete implementation of Linq.
  • Join syntax not as thorough as SQLike(?)
  • The fork at gitHub which targets node.js is by Marak Squires who recently got in trouble for stealing code

"JSinq"

Kai Jaeger's JSinq uses Fluent javascript or linq-like strings for Querying JSON. Try it.

PlusMinusInteresting
  • Includes embedded expression language
  • Separate "create query" and "execute query" steps.
  • Can write queries as a single embedded string rather than pure javascript. :-)
  • Can write queries as a single embedded string rather than pure javascript. :-(
  • Can write queries as a single embedded string rather than pure javascript. (c;

"jLinq"

Hugo Bonacci's JLinq uses Fluent javascript for Querying JSON. Try it.

PlusMinusInteresting
  • Includes really thorough/practical set of predicate functions
  • No joins other than intersect and union

"jimmyLinq"

Jimmy Chandra's blogpost that I've dubbed JimmyLinq uses Fluent javascript for Querying JSON. Try it.

PlusMinusInteresting
  • Simple. A good starter if you want to write your own version of such a library.

  • Too simple.
  • Most amateur/"rough and ready" of the lot. Doesn't take itself as seriously as the others.

Some other JSON Query languages I could've looked into if my travel time was significantly longer:

All of which would stop me from getting back to releasing the product I should be releasing, or any of the other technical obsessions I'm trying to develop. So if you're interested in any of those... you're on your own.

 

What then, is b?

(This was going to be an article about how impossible it is to design one language that has all my favourite features. But instead, became a scene from "A Coder's Edition of Saw.")

You wake up, in unfamiliar surroundings.

You must've experienced some kind of memory loss because you have no idea how you got to where you are. Your forehead is brittle with dried blood.

In front of you is a computer screen, and on the screen it says:

a = Add(2,3);

//a is 5.

b = Add(2);

//what is b?

Intriguing. What is b?

Because you're uncertain of the language in question, you can't be sure.

It could be that Add is an overloaded function, in which case b would be an integer. Its exact value is anyone's guess.

Or it could be that Add has an optional second parameter. Again b would be an integer, though its value could be anything.

It could be that the code refuses to run. The missing parameter is a deal breaker.

But you look at the tattoo on the back of your hand, the 11th letter of the greek alphabet, and you are certain.

What then, is b?

 

SQLike: A simple editor

editor for JSLike

Here's a SQLike editor I wrote. It lets you get your hands dirty with SQLike, the client-side query engine from Thomas Frank.

This started a few weeks back. I read that Thomas had created a nifty DSL in Json for querying (and modifying) arrays of Json. The correct name for it would've been 'JQuery' but that name had already been taken, so he called it SQLike. ;-)

I set about writing a simple editor for it (in the style of the World's Simplest Code Generator) and came up with this fairly usable SQLike editor.

I don't assume you've got any Json to query, and instead expect you to start with a chunk of CSV. I turn that into an array of Json (named 'JsonData') then exec your query over it.

The UI lets you join and query up to two tables at once. I meant to extend it to N tables, but bus-time only lets me do so much, and I keep running into interesting people when I ought to be programming.

editor for JSLike

In my day job I hand write a lot of sql. And with this editor I quickly found that even though SQLike is lighter than XML it's quite 'ceremonious' compared to writing pure SQL.

Apparently Thomas is hoping to making the syntax for SQLike a lot lighter yet, based on comments here including:

"...stop using pipes — the hell with it: reserve a few words :-D..."

...a sentiment I fully agree with. I look forward to any future versions. If you're listening Thomas: keep going! This is an intriguing project!

Also, I want to add I've already found SQLike useful in helping to achieve my day-to-day data-manipulation activities. I can go straight from CSV to 'queries' without having to put the data into a database first.

Sometimes I can't help but picture the future as an endless sea of cubicles, populated by workers struggling to perform data-manipulation duties. And many will continue to get by without any real tools at all. No sql. No sqlike. Not even a wscg or an excel-formula to help them out.

A future "bus project" might be to implement a similar editor for the overlapping project: JsLinq.

Feedback, criticisms, ideas and suggestions always welcome.

 

HOT GUIDS: A hot or not site for guids

Social software seems to be going into a lot of niche areas lately. I thought I'd try and jump ahead of the next wave and build my own social website:

HOT GUIDS - Socializing the Guid

HOT GUIDS - Socializing the Guid

Finally there's a place where people can vote on and discuss their favorite guids.

I've built in pretty much all the best social features. You can vote on a guid, see other votes for a guid, adopt a guid, or email a guid to your friends. And if you get sick of the guid you're looking at: with the click of a button you can move onto a whole new guid.

I'm trying to really take the long tail of human interest by storm. If I get just one customer for each guid, then I'll get... oh I don't know, it must be a *lot* of hits.

Thanks to Stack Overflow for the guid generating snippet. The web template started out the same as 'CreditCardOlogy' but with a little (Powerpoint + MSPaint + PngOut) I took it to a new place entirely.

If you're unsure what any of this is about, please read about guids (& UUIDs) at wikipedia, or try running this Simple Proof That Guid is not Unique.

And make sure email me if you see any particular delicious looking guids. There's some beauties out there.

 

How does life get better? One tiny hack at a time.

I use a HP netbook, on the bus mostly, for bashing out furious code while crammed between passengers (much like this guy). It's a nice little 'puter.

One minor grievance is that with the keys all cramped together, it's hard to find the F5 key without looking. For many reasons, (Refresh, compile & run, execute...) F5 is a BIG DEAL.

So, to give it some tactile presence, I put a tiny sticker, with a rough surface, over the F5 key.

Now I can find the key by touch, in an instant.

Porous tape on the F5 key.
How does life get better?
One tiny hack at a time.

 

I gift this hack unto thee. ;-)

 

24 things to do, and 100 things *not* to do (yet) for building a MicroISV

I've been building another microIsv lately, and as such I've had to produce a new 'to-do' list to keep me focused. It steals a lot from the previous list but matches my current predicament more closely.

I've got 24 things to do, but 100 things I'm *not* going to do just yet. In TimeSnapper (a moderately successful Micro-ISV shared with my colleague Atli) we go well past the first 24 items, and far into the next 100.

Consider also the fractal nature of this work... each item can contain its own sublist of critical and non-critical action items... and so on. A length essay (or at least a series of links) could be provided for every item on the list.

(The worst thing is... even though I know that only the first 24 are needed for now... I so badly want to do the rest before I finished the first ones. It's killing me!)

mandatory (1-24)

i intend to complete items 1-24 before 'launch'. (Things already completed are shown in a lighter shade)

micro isv application:

Update: these are some pre-steps that come before everything else

  1. Come up with ideas
  2. Minimal market research
  3. Choose purchase model (e.g. trialware/feature limited)

And here's the list itself...

  1. build the simplest product imaginable
  2. fill it with particles of delight
  3. mark some features as 'paid'
  4. make it a standalone exe
  5. have an eula shown on first run
  6. have a form for registering the application
  7. call the registration webservice, store the result
  8. on startup, check if registered
  9. if registered, unlock the paid features & hide registration hooks
  10. naming, branding, logo to match url

micro isv website:

  1. get a url (technically, this step comes before step 10)
  2. choose your server-side technology stack
  3. purchase hosting
  4. choose website template
  5. index page (landing page)
  6. choose a price
  7. register with payment gateway
  8. purchase page
  9. handle payment notification from payment gateway
  10. send "registration code" email
  11. thank you page (show registration code)
  12. webservice to confirm registration code from client
  13. download link
  14. screenshots of app

for extra credit (25-71)

i'll probably do these.

tax and legal protection

  1. incorporate

continual improvement:

  1. beta testing from friends/critics
  2. ask at business of software for feedback
  3. bugtracking/support system (e.g. fogbugz for startups)
  4. "uservoice" for feedback
  5. web analytics
  6. drive support costs down

advertising/promotions:

  1. update your email signature so you're always representin
  2. shout out on twitter
  3. blog about it at your day blog
  4. sidebar and footer links from your day blog
  5. ask for links from your friends' blogs
  6. pad file
  7. register at download sites
  8. twitter account for announcements
  9. build a community
  10. build a movement

website enhancements:

  1. about page
  2. help page
  3. faq page
  4. privacy policy
  5. articles on your niche topic
  6. refund policy
  7. usage policy
  8. various pricing levels
  9. release notes page
  10. automated backup
  11. bug reporting link
  12. privacy policy
  13. 'try it online' for free
  14. an article targeted at each potential user group/demographic
  15. amazing screen shots
  16. testimonials

app enhancements:

  1. implement most desirable features
  2. release often
  3. check online for current version #
  4. background download of updates
  5. link to release notes inside application
  6. feedback link inside app
  7. suggestion link inside app
  8. bug reporting link inside app
  9. an offline way to register
  10. have a commandline way to register

application development:

  1. source code repository (actually this is item 0.)
  2. extra backup
  3. obfuscation (eazfuscator?)
  4. unit testing

for even more extra credit (72-124)

i may not get to these. i haven't bothered categorising them

  1. locate relevant user groups/communities and give them free licenses
  2. locate niche bloggers and solicit feedback from them
  3. a form for adding testimonials
  4. survey the competition
  5. talk at user groups
  6. talk at conferences
  7. revision control
  8. self service for lost serial numbers
  9. a/b testing framework
  10. crash reporting from the field
  11. bug/suggestion reporting from application
  12. branding/logo at the payment page
  13. continuous integration
  14. automated releases
  15. adwords campaigns
  16. advertise in non-google networks
  17. box shot 3d
  18. web casts
  19. disk shipping (aka on-demand fulfillment)
  20. companion products
  21. upselling
  22. email campaigns
  23. be cool
  24. sign up/email harvesting
  25. follow up email tutorial series to non-paying (and paying) users
  26. product roadmap
  27. spam control
  28. a low-impact installer
  29. uninstall reason collection
  30. competitions
  31. discounts, e.g. student, charity, startup
  32. product blog
  33. thriving plug-in community
  34. vm test bed
  35. multi-browser testing
  36. customer satisfaction surveys
  37. internationalisation and localisation of product
  38. internationalisation and localisation of website
  39. campaign websites/websites named after keywords
  40. professionally designed website
  41. app analytics
  42. companion urls, e.g. .net, .org, nation-specific
  43. ci monitor
  44. status panel
  45. usability testing
  46. give licenses to MVP's list
  47. give out promotional gifts
  48. sponsor something
  49. Run an affiliate service
  50. check compiled binary with virus total
  51. virus free logo on website
  52. sign your binaries, e.g. authenticode signed.
  53. stop reading/writing this list and implement something

Stay tuned of course.