I don't mean scripts or tools for your work project. I mean actual software for your personal use, such as party organizer, CD administrator, whatever.
A clock, which shows money not time, a brilliant way to stay focused at work. I toyed with creating a multi-user version, known as the meeting clock, where we could cost the meeting in realtime, really good for keeping meetings short, but it didn't catch on as everyone would then know who earned what.
I've tried several Mac OS X dashboard widgets that retrieve lyrics from the Internet, but I never found one that I liked. So I wrote my own.
I wrote a ScreenSaver that rendered the US (with US Presidential Polling Data), but I couldn't find decent geometry data for all the states. So I wrote a Python tool to trace out textures on a image.
I had fun one night loading up a high resolution Google map of the US into my Python tool and then painstakingly tracing each state and saving the data to individual files. I now have a pretty decent set of geometry data for North American states.
I wrote a neat system to organize my snippets. I had literally thousands of them consisting of various mini libraries for conf file parsing, malloc() logging / debugging, general logging, socket functions, all kinds of stuff.
I had to be able to search for what I wanted and easily 'grab' the snippets via the command line. So, I could:
mkdir newprog
cd newprog
snippy search "foo"
* bar1 - replacement for foo that does better logging
* bar2 - replacement for foo that cuts your lawn
snippy insert bar2 libs/
Voila, done. I did it with sqlite3, I may even release it one day once I clean it up.
I wrote a templating language for a website. It's pretty simple, but effective. The main requirement was so that I could add new articles to a list-like page by adding a few lines in one file, instead of modifying four files in just the right way.
I'm still impressed by how useful it is.
In 11th grade, I was presented 200 words to define with synonyms. Rather than complete the assignment as given, I downloaded an online dictionary (Project Gutenberg) and created a mass word definer. Most students took 8 hours to complete the project, as the rules for definitions were rather strict. It took me 1 hour, and none of that time was spent doing laborious copying.
The MassWordDefiner sat on Download.com for a while. You can still find remnants of it if you do a Google search.
Like many programmers, I tried doing Sudokus, then felt compelled to save time by writing a program that solves them by brute force.
I triumphantly showed it to my wife, who just shook her head.
A desktop application named 'IOU' that my girlfriend and I use to keep track of how much we owe each other. It has two tables of data, one where we enter money that we lent each other, and another where we enter joint expenses that were paid for by me/her/both. It assumes that each party is responsible for 50% of joint expenses and shows how much I owe her (or vice versa). It also has an 'archive' feature which hides all previous transactions, but preserves the balance owed.
Prior to IOU we used to use a spreadsheet, but her Excel-foo is weak, so she kept overwriting the cells containing formulae.
Ummm... quite a bit. Some of the more interesting ones:
- a podcatcher. I plan to release this one some day (this is recent).
- my own music tagger. Not many existing ones handle classical music well. Need to rewrite this someday. Then maybe release it.
- a web app to track the soda inventory sitting in my small fridge :-D
- a distributed computing platform, used to encode ogg files faster. Sort-of released publically (this was back when a dual PII-450 was fast)
- web front-end to linux tc
- my own time tracking/invoicing/billing system. Twice. One of them was in HyperCard, which you've probably never heard of...
- my own bug tracking system. At least once.
- a web-based dungeon crawler. Think web-enabled adventure. Back in, umm, '97 was it? Come to think of it, it's still on line. (please forgive the code, I was in middle school at the time!)
No doubt I've missed a lot. Those are just ones that I quickly saw sitting around in a version control repository...
A program that computes the date of transition from standart time to daylight savings time and back in any given year.
It's ironic that Windows knows when it is to happen, but never tells in advance, it only does tell post-mortem. And I don't want to painfully recall or find this online.
When I switched from Windows to Linux, I was glad to finally get rid of Quickbooks for my tiny investment company. So I took the opportunity to also switch from Excel to OOoCalc.
I put together a double-entry bookkeeping (did you know that's the only English word with three consecutive double-letters (well, other than bookkeeper)?) into which I could just enter balanced multi-line transactions and it would check them produce nicely formatted reports (P&L, balance sheet and transaction lists for both).
Then I just hand that over to the accountant at the end of the year. He's actually expressed an interest in marketing it to several of his smaller clients and I'm in the process of polishing it up and providing a direct feed into his own accounting package.
Other than that, I've got spreadsheets in OOoCalc for managing the share portfolios. Not much else that isn't toy stuff (connect4 and maze games for the kids).
AnyGen. A program that can be used for generating random stuff.
I used it as a vehicle for learning C#. It lets you create tables, reference other tables, and give weighted values to items in the tables. Some of the tables I created were:
- name generator
- inn name generator
- inn menu generator
- weather generator
- critical hit table
- full treasure generator for DnD 3.0. All 20 levels.
Replacement for the calculator included with Windows Vista is something I wrote for myself last night in Clojure using Swing. Simple enough and fun, maybe even useful. http://www.acidrayne.net/node/52
The most recent thing I have written for personal use was to address problems with this digital frame I own that has a lack of features such as random picture viewing and max delay of 30 seconds for a picture. I wrote a quick win app to solve it.
To solve the random issue, it takes a directory and then randomly generates filenames for all the pictures.
To solve the problem of wanting a longer delay it then uses the random filename and adds and number to it makes duplicate images for every 30 seconds of delaying that I want. So if I want it to cycle pictures every 5 mins, it makes 10 identical pictures.
Space became an issue with the delay making all the duplicates so I built in picture resizing to match the frames resolution and converting to jpg. It actually ended up doing a better job of resizing than the frame was doing so as a side effect I actually got better looking pictures displaying as well :)
I have also written many tools for online games to help me in a variety of ways.
Does a generational AI solver for the light-bot game because i simply couldn't figure it out count?
- As I lost all of the Music Library on my PC that I had synced with iPod and that iPod stores the files with some weird names, I used a Java API to read the ID3 tags and reorganize the music files with titles as names and Album names as folders.
- The other one was that for one of
the Internal Audits that were
conducted in my company to check for
media files stored on the PC, I
wrote code to flip the first bit and
rename the file as DLL and with some
randomly generated name and move
them under
C:\Windows\System32
. In this program I created a map and stored as another DLL under the same folder and after the audit undid the same process.
These two are the favourite ones that I wrote for personal use.
Rest and Stretch - a program to manage my RSI by not allowing too much keyboard or mouse activity.
Dialog Automation - automates responses to dialogs and windows as they appear.
Keyword Expander - can automatically resize dialog and windows to make bigger or move around - also can resize and move child elements of the dialogs
Do your Homework - stops me playing on facebook or stack overflow too much.
A Program to reset the corporate mandated screen saver timeout.
Podcast filler - fills my music player with random un-heard so far podcasts that I've subscribed to, keeps track of 'em so I can't listen more than once.
Seems I'm both lazy and undisciplined.
At the moment I'm working on a "run" program for Windows that functions similarly to the Vista start menu. Type in what you want to run and it lists the results.
I built it because of my hate of using the start menu in Windows. Click click click.
Versioning File System for Windows built using IFS Kit. Quite similar to DEC VMS file versions - every revision of any file in protected directories are retained automatically. Complete with file explorer with adjustable timeline. Pretty cool actually. Was going to market it but didn't detect much demand so I use it myself for some projects. [movie]
When my wife got pregnant the first time I wrote a due date calculator. I also wrote my own app to copy images off of my digital camera. It did rotation and a few other tricks, but nothing too fancy.
Then there are 100 other project I've started but never finished.
I wrote a "secret santa" program for a gift exchance between friends. It accepts a list of people along with blacklists, gift suggestions, etc. The results are mailed out to the recipients so not even the person running it needs to know who has whose name. The initial version was written in C about 10 years ago. It then migrated to C++ and finally to C#. We still use it yearly.
I wrote a plugin for Windows Media Center that displays in how many minutes buses and trams arrrive at my stop. Parsed from the traffic-company website.
The last one I wrote was a simple accounting application for tracking daily expenses. It was a Windows Mobile application.
3-4 years ago I wrote a Windows Desktop Wallpaper changer that allowed you to select a set of image files and have them change at configurable intervals in sequence or randomly with options to set the mode for stretching/tiling etc.
I still use it on all my machines. However it looks like Windows 7 has added this functionality to its wallpaper option in Control Panel - so it looks like it might be obsolete in the near future.
A while back, I also wrote a piano chord/scale finder utility for personal use - it displays the notes of a chord and/or scale on a piano keyboard, plays the chord and features inversions and quite a few other things. It was originally written in VB6.0 and I am currently porting it to a Silverlight version.
A small program that would take a bunch of IP addresses (of proxy servers), ping them and separate them into two lists - dead and good ones. Still use it once in a while.
I wrote my wife an app that allowed her to tap the spacebar to indicate the start and end of her contractions (about all you can do at this stage, apparently!). This then gave her a precise indication of how far apart her contractions were (with a nice chart, of course).
When the midwives arrived I could tell that they were impressed, even if they didn't want to admit it!
I DL a lot of radio shows and I wanted to automate the process of organising them into folders. The files generally don't have ID3 tags, or tagging is patchy or inconsistent. They do tend to have useful names though, like "I Clavdivs", "Clavdivs the God", "Documentary on Clavdivs".
I wrote a C# app that parses a directory files and, with a bit of jiggery-pokery, it matches file names to common sub-sequences and uses a ranking to find the most "popular" sub-sequences, which it then uses as the basis for folder names.
To cut a long story short, I can run it on a folder of files and in a few seconds everything is organised into meaningful folder names. For the example 3 file names above, I get a folder "Clavdivs" with all three files inside. Sweet!
As it does not rely on ID3 it works on any file types: it's equally good at organising photos, data files, movies, rar & par sets, etc.
PaulS
I wrote an app that compares cell phone costs across the spectrum. It was a few years back, when the 3 national operators were doing all they could to obfuscate costs so we couldn't compare apples with apples.
My app would take your itemised bill (csv file), and calculate against a selection of packages. It worked well, and I learned a great deal while writing it.
AssetsGraphed for tracking my personal finances. It was my first Ruby on Rails application.
Back in the mid 1990s, I wrote a repeating alarm clock called OOSAlarm to remind me to take Micropauses (12 second pause every 4 minutes) recommended by my physiotherapist. I've had it available for download on my website ever since.
Every time I get a new PC, whether at work or home, OOSAlarm is one of the first tools I install. It bugs the living daylights out of me - but has undoubtedly helped me stay healthy.
I used to use a PVR system called GB-PVR. When I needed to upgrade to newer hardware I didn't want to lose the recordings from the recordings screen. I could have just copied them over to the new PC and added them to the video library, but that didn't feel right.
So, I wrote a tool that scanned a folder for all MPG files, created an import xml file and ran the built-in recordings import function of the GB-PVR software. It worked great, but I did have to do a bit of testing with a test installation of the GB-PVR software. I released the software to the GB-PVR community and started to get some positive comments along with feature requests. So, it grew for a while. But I began to lose interest in maintaining it when I moved over to MediaPortal, so I released the source code in case anyone else wanted to make changes to it.
I just checked an it's still on the wiki here. It was interesting for a while as I learnt a few things while doing it.
My own torrent website. Yeah, got bored one day and made my own torrent website/search engine. Full system too (sorta?). Check it out here: http://torrentino.info Also made my own blogging system and a full featured website/server pinging script too.
I wrote a one-pager web application using PHP and jQuery UI to load batches of images from a subdirectory and display as stacks using CSS on an interface where I can drag, position, and clear them.
I use these images as reference for when I am drawing. I keep it on my local XAMPP install and bookmarked it with Prism as an application so it opens in its own window. I call the application Corkboard and find it way more useful than Windows Preview or any other application since they don't allow seeing full-resolution versions of multiple images.
A glut of AutoHotkey functions. Technically, it's all one program, but the code is pretty modular, and a lot of it consists of what you can get in the form of smaller apps. The modules include a clock/uptime tooltip, a take-a-break reminder, a stacked clipboard manager, cycling wallpaper, and a grid-based window mover/resizer that allows me to manipulate GUI windows with OCD precision without having to rely upon the mouse. The rest of the AHK stuff consists of hotkeys and automations for programs with accessibility problems.
When I was 12 or so, I wrote a QBASIC program to help me improve my math skills. Later, I made a few Dragonball Z inspired typing games to help me increase my speed. (Alas, none of them were over 9000.)
- Wrote a calculator that takes expressions ('3^2+5cospi'), also can draw graphs. Still have it online somewhere. But that was years ago...
- Wrote a systray app that toggles the screen saver. My sister wanted to disable the screen saver when she's watching long movies online.
- My girlfriend Suzi exported her SMSs using the cellphone's program, which resulted in hundreds of text files (!). I wrote her a program that parses these files and creates an Excel file, with all data arranged in columns.
- Wrote a tiny program that delays subtitles by a few milliseconds (open file, add number, save file). Not needed these days.
Wrote Suzi a GreaseMonkey + jQuery script to make a web site much more usable - each image was on a different HTML page, so I used ajax to put them all together.
Now I'm working on something to keep track on my expenses. I'm planning to do that with my girlfriend, I want to teach her some web development.
After being fed up with people asking me to create a website for them, I wrote a program which can create and upload them automatically. I just select a template, enter the text they want to appear and select a few pictures. It then compiles everything and spits out a XHTML1/CSS2 compliant website straight to their webspace. Written in C# and .NET 2.0 with the templates in XHTML/CSS/etc. and all dynamic content handled using JSON. I'm even thinking of marketing it.
At one point we had some fairly flaky servers in our organisation. I wrote a screensaver for my machine which showed the Processor % for the various servers, much like the graph in Task Manager, but full screen (and showing processor usage from various machines).
The idea being, even if my machine was locked and I was sat in a meeting on the other side of the office, I had a pretty good idea if one of the servers had spiked (or conversely, if one died).
I've written an application that takes an dictionary and returns all words ending in a specific extension. For example cyb.org
The purpose was to search a nice domain name.
I wrote a page in PHP scraper that extracted all the movie info from a movies page on IMDB for a large list of movie IDs, and put it into a database. A script would then read the info stored in the database, and generate an entirely different movies portal of my own, with full pagination, images, and so on. Another script would pull relevant products out of Amazon and Art.com and display products related to each movie on each movie page.
To increase the size of the portal, I simply had to add more movie IDs into the database and re-execute the script.
I learned so much from that experiment, I get a happy, warm fuzzy feeling whenever I recall....
I implemented this with ASP.NET a few weeks ago:
http://www.primroseleague.co.uk/
It has my own songs on it, with lyrics, free .mp3 downloads, comments, the usual stuff.
I would have used ASP.NET MVC but the hosting service only supports .NET 2.0. I found it easy enough to get something like an MVC architecture.
When I get some time, I'm going to get into jQuery and plaster it with ajax for no good reason.
- Some simple scripts to organize the pictures into HTML galleries, resize them and generate thumbnails.
- A backup system in Bash with DVD burning option.
- Chatbot with silly sentence generating algorithm that gives pretty amazing (mostly funny) results. It was written in D and once I lost my notebook for 5 hours, because my friends kept talking with it and did not want to end :).
And I wrote my own blogging script for my website.
I wrote a simple widget for Mac to convert back and forth between decimal and binary notation. For a bigger application I was working on, it became convenient to store "12345" as 2^1 + 2^2 + 2^3 + 2^4 + 2^5 = 62. So I wrote a widget that went from "12345" to "111110" to "62" so that I could see what I was actually working with when I debugged.
In another moment of fun, I rebuilt the NY Times flashed based "kendoku" game into a standards compliant xhtml/javascript/css version as a proof that some flash games don't need to be flash. I ended up with a near identical version of their game, exact same functionality, plus some extras that I felt like they were missing. Good experience.
I wrote a program to generate statistics from an XML database of raids in World of Warcraft that my guild had done, and to convert it to BBCode on our forums, because I got really tired of figuring it all out myself each week.
I have a rather large DVD collection and I got tired of scanning the shelves to decide which one to watch. So I wrote an app that would keep track of my library and allow me to search for types of movies I wanted to watch.
Back in high school I wrote a garbage collector/defragger for my calculator.
Last year I wrote myself an alarm clock that required entering a sequence of numbers, to force myself out of bed and my brain to start working coherently. Worked well for a few weeks but I began to mistrust the accuracy and stopped using it.
A firefox plugin to collect images. It does all the work of saving them, recording where I got them, renaming duplicate file names, and putting that info into a database for me.
Back in the "good old days of VB3" I made a number of tools for my personal arsenal.
1) A program for auto-loading videos on cd/dvd that displayed cover art, a link to imdb and a play button.
2) A tool that did file comparisons. This one was my favorite. When I first got interested in programing it was for AOL2.5-AOL3.0 "proggies", "punters", "scrollers" and other damned annoying crap were the big thing. I didnt make those programs, thankfully.
Someone released a program that would allow you to decompile them to VB3 source. Sure, the code looked like crap, all the varibles meant nothing, but you could change a few things, recompile the source if you wanted and make it "yours".
Then someone came up with this idea to change a few bytes in the header of the VB3 program which would cause the decompiler to think the executable wasnt a valid VB3 file. Then out of no where, everyone was making their own 'decompile protectors'.
So, I made a small 1 form, 1 label program and would run the so-called protector against it and do a file compare and undo what ever it was that they did to protect it. For the most part this was a simple byte change some where around byte 34 of the file.
Then I added their changes to the list of changes my program watched for and undid them, leaving the program unprotected. The fun thing was, these "protectors" were protected by their own scheme. I would undo it, decompile it and post the source. Needless to say, some people didnt like it.
I never released this program into the wild, but it had a ton of other things it could do, like generate subclassing code to get rid of the standard title bar of a program and make some gradiant thing instead. It also served as a very very bad screen saver.
Sadly, a few years ago (something like 8 years ago) the harddrive it was saved to crashed and began making the dreaded click noises. Still to this day I wish that drive was good and I could go back and look at the code. Nostalgia at its finest.
3) I also made a very very basic game that subclassed AOL chat rooms and watched for commands. The game was called 'Wizards and Warriors'. It was a turn based two player game. It had something like 7 different attacks that varied in damage dealt and based on a random roll for if the attack landed, and what range of damage it would do. Was a fair amount of fun as it kept a scoreboard for kills based on the player's screename.
Those were the Good Old Days :)
I'm working on a Django app to record votes + manage setlists on cover songs for my band.
Basically, we suggest and vote on songs every now and then, in a few stages. Currently we use a wiki but it's hard to keep it updated and votes aren't as anonymous as one would like.
I've also written a page that allows set-list editing via drag-and-drop, and it also keeps track of various data per song (acoustic/electric guitar) and marks these changes in the printed setlist, so everyone knows when we have to wait a bit between songs.
Programs I wrote in C# for personal use:
- Organize my digital photos and sort them so I can quickly backup them to DVD without wasted space on each disc
- Display photos from different digital cameras in a timeline format so I can adjust incorrect date and time in the EXIF metadata easily.
- A Family Tree manager that allowed me to print a PDF of my family tree (Huge! close to a hundred pages)
- A file renamer.
- Duplicate image finder (related to 1 and 2).
a Visual Novel engine in DX 'cause i wanted to know how they may work
a cheap, tiny (but incredibly usefull) C binary which allowed me to switch the icon view of the desktop to whatever mode the listview supports 'cause in some bad cases i had more than 120 items on it at a resolution of 1024x786 [sadly it doesn't work on Win7 anymore - can't get the handle to the programmanager window for some unknown reason]
dailystrips, a program to automatically download multiple daily webcomics.
Instead of iTunes, we use Media Monkey. We love it except for when we added a remote control. The UI uses very small fonts that makes it very difficult to use a clumsy remote pointer to do much unless you are close enough to just use a mouse anyway. So I made an alternate UI for it. It's big and ugly and really functional. The buttons go to the edge of the screen with no buffer zone. Everything is in black and white and where ever the cursor is gets highlighted. We use it daily and love it.
I used to do extemporaneous speaking in high school. I used a lot of online sources but you couldn't have computers in the prep room - just paper (you carried HUGE file tubs with newspaper clippings, magazine articles, etc around. They probably still do). I had to print out all of these online articles and make notes of dates accessed, authors, etc. But the graphics were awful on our printer, so I made a program to strip out IMG tags, then other graphics-intensive tags that were extraneous, and then I standardized font sizes, spacing, etc so it was easier to read in print. Kind of an automatic print version.
"Who's round is it?"
Many moons ago in my first job we went to the pub every lunchtime. Every day someone bought a round of beers for the team. Problem was there were one or two tight-wads who always had to nip to the loo or had a coughing fit when the question was asked: "Who's round is it?"
So I wrote a desktop app in Delphi that listed on pub attendees and kept a score of number of times they'd been to the pub and the number of rounds bought. I think it also factored in how many beers they bought on their round.
Very useful but there was still one guy who simply never bought a round, ever.
I wrote a Valentine's day program for my husband that used the Microsoft Agent w/voice (think the characters that appear on the search screen by default in WinXP) to read him his Valentine's greeting out loud. What looked good on paper, sounded really creepy when the Wizard started reading it. We had a good laugh though!
I started writing an app for Debian systems which works kind of like the RedHat network does. I had every intention of finishing it off some day but for the past 2 years it's sat idle, barely able to read the package database, detect available updates and schedule scripted tasks. I guess I should get around to implementing the server so that it can be controlled...
I made a converter from color document (highlighted code in HTML) to a nicely grayscaled document. So when I print my code with syntax highlights on a black-white laser printer, it is easy to read.
A few years ago, my internet connection was provided by the computer centre of my university. The only way to access the internet was to login via Cisco VPN. Now the problem was/is, that the cisco Client is (still) unable to keep your connection up 24/7. That's because as soon as the connection breaks (for whatever reason), the client displays a messagebox informing you that the connection broke. Great! Long story short: i reverse engineered the local Cisco protocoll and wrote my own client, namely the Evil Client. Many students at my place and even a few profs use it since then :)
I wrote an app that finds my wife a temp job (so important in today's economy). It logs into a website, keeps refreshing the list of available jobs, and if there is anything in the list, it selects a gig based on certain criteria.
And I may not be the direct user, but I do directly benefit :-)
I bought a DVD + SD card camcorder and found out that it wouldn't record video to the SD card, nor could one copy videos from the DVD-VR discs it created. So I wrote a program to extract the individual programs from the DVD-VR: http://www.pixelbeat.org/programs/dvd-vr/
Dragonpaint (Dragon 32 BASIC)
When I was a kid (in the eighties) I wrote this application which mimicked MacPaint after seeing a MacSE for the first time. I wrote it in BASIC. It had some nice features like UNDO and printing. It used the joystick as a mouse.
File Sieve (Ruby)
This very naive script sorts the file in a directory according to the tags. Saves lots of time.
Many small scripts (Autohotkey, Javascript, Ruby...)
I love to automate small tasks (like grabbing some files from a web site, generate code, autologin to some site, etc.) and I have various scripts in different languages.
I created a learning tool, to learn the vocabulary of a new language (it shows you your progression, ask questions, and you can easily extend your vocabulary sheet)
I wrote (or more accurately hacked up) an online photo gallery in PHP for use by myself and a group of friends. It's now got over 7,500 images on it and Twitters whenever someone uploads.
I wrote a chess clock that runs in the browser using jquery. It supports 5 different time control modes. You enter the time for the players and the time control settings, start the game by pressing s, and end your turn by pressing the space bar.
I'd be happy to get some feedback.
I've written these Firefox addons:
Affiliator - Generates Amazon affiliate links with one click from any page on Amazon.com
baNdit - A port of Farkit for banniNation.com, with a bunch of additional features, like the ability to ignore users, paste links or images from the clipboard as formatted HTML tags, and copy/paste memes with a few clicks.
CopyURL - Copies the current page or image URL to the clipboard, wrapped in an anchor or image tag. It defaults to HTML, but comes with BBCode and Wiki formats, or you can build your own.
TextSaver - I built this in 3 days for the Extend Firefox 3 competition, and to keep my wife from getting upset when she spent a lot of time on a post or email, then accidentally closed the tab and couldn't get it back. It's not maintained, and I've since written a much smaller GreaseMonkey script after being inspired by StackOverflow's feature that stops you from closing the tab if you've started typing an answer.
A few years ago I was taking a finite mathematics course, and one of the topics we had to learn was matrix multiplication. I learned the technique pretty quickly, but solving them by hand was frustrating - you might not catch one little mistake until several pages later.
The process of multiplying matrices is very algorithmic, of course, and so is the perfect kind of thing for a computer to do. I reasoned that if the purpose of the course was to learn how to do matrix multiplication, writing a program to do it would demonstrate an adequate mastery of the subject.
The end result isn't exactly a beautiful work of art, but it functions quite well. I decided to release it as freeware...
I've written quite a few toy programs. The recent one was a bit serious one. We are using DAL (generated by SubSonic) in our project. It is a big project so there was to be a business logic layer (BLL). We didn't want to access the DAL objects directly from UI layer. So we had to implement properties of DAL objects in bll objects. My colleagues were very opposed to the idea. They were not able to see the benefit of separating the responsibilities.
So I wrote a code generator using C# utilizing Reflection which took DAL Assembly generated by SubSonic, browsed for the types implementing ActiveRecord and generated a stub class exposing the (column) properties in DAL objects through BLL objects and writing constructor and save method.
Simple requirement management tool - it took me one week. Buying commercial package would cost me few months of my work at the time, so it was a good deal.
A few years ago I wrote a Family Tree website in ASP.NET for my own use that I am still using. It is not focused on graphics at this point. More with storing of the data and detailed notes about events and people and connecting all of the relationships. It also has pages that show aggregates of the data, like number of people with a surname and pins on a map for births, deaths, weddings, etc.
Like someone else mentioned in a previous answer, soon I'll throw a bunch of jQuery, ajax and probably convert to ASP.NET MVC for no specific reason.
I wrote a throw-away utility (using D) to re-arrange large volumes of detective conan manga.
The manga I downloaded was organized in volume/chapter hierarchy with different style for naming (e.g. Chapter 10, Ch11, etc), the files inside them were numbered in all different kinds of ways.
I wanted to re-organize them into stories/episodes.
So the command line tool would receive a range of chapters and a name, and would pull all images from those chapters and rename them and put them inside a folder called [v.ch][v.ch]Episode Title
i.e.:
[01.01][01.02]Shinichi Shrinks [Episode 001] [01.03][01.05]Kidnapped Girl [01.06][01.09]Idol's Locked Room Case [Yoko] [02.01][02.03]Perfect Alibai [02.04][02.07]100 Million Yen Robbery [Miyano Akimi] [02.08][02.10]Imprisoned Killer in Haunted Mansion [Shonen Tantei] [03.01][03.06]Hatamato Family Ship Murder [03.06][03.10]Strange Presents [04.01][04.03]Art Museum Murder [04.04][04.06]Train Bomb [Gin][Vodka] [04.07][04.10]Treasure Code of Italian Gang [05.01][05.05]Bandaged Man [05.06][05.09]Karaoke Case [05.10][06.01]Conan Kidnapping [Shinichi's Parents] [06.02][06.05]Three Visitors ..... etc
All my open source projects were written for my own benefit - going back 20 years or more. They ranged from screenblankers to image views to games played on calculators. My sourceforge projects are the same - AstroInfo, PDF2PSP, HPConnect, Sound Bridge Commander were all written for my own use and shared out. Even the facebook app I wrote is really for my own use.
I wrote a drum machine back in 2005. http://gneutronica.sourceforge.net I had come up with a guitar riff that had 13 (or 26, depending how you count it) beats, and the riff resisted any effort to add or subtract beats by losing it's coolness. The only real linux drum machine at the time was hydrogen, and it didn't do weird timings. I wanted to learn gtk, had some MIDI synths lying around, and wanted to know how to drive those as well... so I wrote a step sequencer (a drum machine interface) that can handle arbitrary steps and timing. Probably the neatest feature it has is that you can cut/paste ascii drum tablature directly into it.
It doesn't make any sound on its own, it just drives MIDI devices. (you can drive a softsynth with it though.)
Blog app where 90% of the interface is the texteditor.
Of course I stopped using it altogether after a few weeks, but it certainly had a nice interface.
A screenshot taking app called Screeny.
When I was 16 and first learning C# (And was enthusiastic with how easy it was to write programs as opposed to C++, in MY case), I used to use a certain screenshot taking app (It looks different now) that was actually a trial. I didn't have the money to buy it, so I decided to shoot down two birds with one stone by trying to write one myself: I would have my screenshot taking app and I would learn a bit more about C#. I ended up modeling it exactly like the trial app down to the UI and functionality, and called it Screeny. It was my first full-blown app I wrote. I then added some extra functionality and many of my friends also used the app.
Now I'm mostly on my MacBook, OS X, which has some pretty good screenshot taking functionality built in that suffices for me. I haven't used Screeny in a while, I wouldn't be surprised if it doesn't work on newer systems (Vista or 7), and some friends told me there were some bugs with multi-monitor setups, that I never got around to fixing. But it did serve it's purpose a few years ago and helped to motivate me to continue learning about programming :)
Filling, an implementation of the `Fillomino' puzzle as seen on http://nikoli.co.jp. Find my implementation at http://www.chiark.greenend.org.uk/~sgtatham/puzzles/java/filling.html.
The rules are simple: fill an n-by-m grid with numbers; coalesce the numbers into maximal chunks such that there are no two different numbers in any chunk. The size of each chunk must be equal to the number it contains.
I did it mostly for the fun and challenge of writing it, but I've played it a few times too, so I guess it counts :)
Wiitones, an application that lets you play music with a Wii Remote (and Nunchuk).
The application has three channels.
Channel 1:
- A: enable sound
- vertical angle of the Wii Remote (i.e. its pitch): control the pitch (i.e. tone) of the channel, in semi-tone steps (frequency factor: 12th root of 2) over 441 Hz.
- B: enable bend
- Wii Remote roll (i.e. angle around the vector from the expansion slot to the IR camera): control the bend. Vertical is none, each 90 degrees (left=down, right=up) is one semitone. (Or was it two?)
Channel 2:
- C: enable sound
- pitch of Nunchuk: control pitch (also from 441 Hz in 2(1/12)-factor steps)
- always bends
- Nunchuk stick, x axis: control the bend (full range is one or two semitones)
Channel 3:
- Z enable sound
- roll of Nunchuk: controls the pitch
- always bends
- Nuchuk stick, y axis: control the bend (full range is one or two semitones)
Use + and - to control the volume (shown in binary on the wiimote LEDs). Use the d-pad plus 1 and 2 to offset the channels by an octave. Home quits, IIRC.
The tones are all sinus tones; Hand-computed sound waves, ftw. :)
It's kind of tricky, though. When the user disengages a tone, you have to continue the sound wave until the elongation hits 0, or else you'll get clicks. While keeping track of the fact that you're going to zero, you also have to deal with the user re-engaging the tone. And you need to do good mixing (hopefully without overflows). And you need to deal with the tone changing frequency not at (conceptual) wavelength markers, but in mid-wave.
- I play Nexuiz against a girl I just met, beating her silly
- I implement a handicap system. You ask for a damage multiplier (between 1 and 100); all damage dealt to you is modified by that multiplier.
- I play Nexuiz against her again, this time beating her (but not silly).
Three lines of code. Profound change in game balance. Pretty nifty :-)
Wiimote XEvent Synthesizer.
A program to listen to a wiimote for button presses (etc.) and generate X events (via the XTest extension), so that I can control my computer with my wiimote. Useful for running Elisa with my computer hooked to my TV.
There are probably many other programs like it; for one, wminput. However, I've grown tired of it---it needs write access to /dev/uinput (bad for security), I need to tell it to synthesize keys pre-keyboard-mapping (so, since I'm using dvorak, I have to say "generate an s" if I want an o). And it really doesn't work well if you want to control the mouse with a nunchuk.
So I wrote my own (in C). It embeds Guile (the GNU embeddable scheme implementation), and I do most of the heavy lifting in Scheme.
I used to have a logic puzzle addiction.
But I got sick of making mistakes in "the monkey work". A simple typographical mistake like misplacing an "X" could take an hour to locate, and 2 seconds to fix;-), more often than not leading to an uncompleted puzzle, which allways feels like a failure, even if it's not worth diddly outside your own head. It just NEEDS to be solved, like a spotty Rubics Cube sitting on a bookshelf. Ergo: No fun!
SO... I wrote a VB5 app (hey, it was the 1990s) which read the Categories and Values from a text file, and rendered the game-matrix (as pictured above) in a picture box. I even rotated the top-vertex labels 90 degrees (creating a rotated fontset) by bit-sampling the painted font and transposing x and y.
I started out with a dumb (purely human driven) interface: - left-click to place an X; - right-click to place a O in the matrix.
Then I added automatic X'ing when you placed a 0:
- which led to X'ing all other impossibilities;
- which led to automatic O'ing when 1 possibility remained;
- Recursion is fun!
This gave me with a "half automated" problem solver which totally sucked because it was "stealing my thinking" but only half-doing the job. I still had to go through every "rule" iteratively to check that every implied oxymoron was X'ed. It was time to step-up to the next level.
So... I wrote a simple "rule engine" to ease the pain.
Let's take a simple example: In the above puzzle you might be given the statement: Lauren doesn't like soft cheese or red wine. Which implies that:
- Lauren is not associated with feta.
- Lauren is not associated with (merlot, pinot noir, port, or zinfadnel); and therefore Lauren must like champagne.
So the rules might be:
- person[Lauren] != cheese[feta]
- person[Lauren] == wine[champagne]
So then you simply parse each rule and place the appropriate O(s) and/or X(s) letting the "consequence engine" developed above fill in the rest of the matrix.
Did I mention that the fun part is the recursion? You need to reparse every rule every time the board changes, which changes the board, which must eventually (but NOT immediately) trigger a complete reparse, until all rules are parsed and nothing new is "learned".
This was an "interesting little problem" and the "genericness" of the matrix and rule engine make it more widely applicable. It's sort of primitive decision support system, fringing on an AI. Good fun.
A program that took a list of track times on a CD, and figured out what tracks to pick to fit nicely onto each side of a cassette tape without cutting off half-way through a song.
Most of the items on this page are things I wrote for personal usage. http://riteshnayak.com/hacks.html
I wrote a Windows Service that counted down the time to the first Lord of the Rings release. It had a One Ring that would sit in the system tray, and when you hovered over it would tell you the time remaining. There were other options when you clicked on the ring - I think opening the LOTR web page or something like that.
Key-mapping utility, that removes the need for shift and altgr keys. By using it you can press '1' simultaneously with any key lower to it, and get '!'-character. Pressing 2 and any key lower to it will in turn result in "-mark and so on. In the similar way you can input lowest row characters ",.-", by pressing them simultaneously with any key above them ("JKL") or left to them ("M,."). First combination will result in ";:_"-characters, second in "<>|"-characters (based partially on nordic- and partially on us-layouts).
I've done a couple of things like this myself, some of which were published in a (quazi-) finished state:
Published:
idnet - A lightweight image viewing utility.
findexe - A Windows equivalent to which on Unix. (Which i did not know about at the time... ;P)
silentcmd - Allows you to run a Windows console command without the Command Prompt showing.
Unpublished:
mpwgen - A simple random string generator.
xclip - A program to change the clipboard via the command line. (I didn't know about the Unix program of the same name at the time.)
Smartcuts - A program to modify a command line with a simple substitution language.
Gmail/Reader Notifier - Sits in the system tray and checks your Gmail inbox and Google Reader list for unread items.
TimeSync Checker - Compares clock drift over SNTP.
TempExtract - Automatically unzips ZIP and TAR files to a temporary directory.
Unfinished:
wdialog - A command-line-based wrapper for common Windows dialogs.
I wrote a unix command-line to find HEX numbers that look like words, so I could use them as arbitrary numeric constants / magic numbers in code.
cat /usr/share/dict/words | grep -i '^[a-fsoi]\+$' | tr 'a-z' 'A-Z' | tr 'SOI' '501'
Got some nice constants out of it, such as:
0xCA5CADE
0xDECEA5ED
0x0B5E55ED
0x1D10C1E5
0x5EAF00D
Lots more great results when you run it.
I wrote a Python script to download all the then-newly-published-online Calvin & Hobbes comics.
I wrote Promptu, an application launcher, to make it faster and easier to get around in my electronic world. I used SlickRun for a while, but I decided to write my own launcher because I wanted more features.
Promptu lets you associate meaningful names with programs, folders, files, URL's, etc, and access them almost instantly from your keyboard. When you press the hotkey you associate with Promptu, such as Ctrl + Q, Promptu opens a textbox for you to type in next to the mouse. As you type, Promptu suggests in a similar fashion to Visual Studio's Intellisense. When you finish typing or see the name of the command you want, press Enter and Promptu will execute the command for you.
Advanced developer-friendly features include:
- ITL, a language for dynamically evaluating text into commands, using external .NET functions and parameters supplied to the command from the prompt.
- The ability to use external .NET functions from the prompt and ITL.
- Namespaces can be used to categorize your commands and functions.
- Ability to automatically synchronize commands, functions (and their associated assemblies) between multiple computers.
I created a web interface for my home media server. Written in PHP and uses JQuery. It allows the user to "administer" the server which supports the following:
- Search Google and other sites
- Monitor Raid, UPS, Hard Drives and other Devices
- Install applications
- Keep track of torrents
- Add movies to XMBC
- Stream music/movies via UPnP
- Provides a uniform web interface for my home network
A colorful notetaking program that I use for write some notes about what I need to say / ask / download / ... divided in categories.
The most recent one is SWiki, essentially a standalone Wiki Software, because I was just fed up with Word for complex documents but did not want a webserver-based software as I wanted my document to be a single physical file on the hard drive.
I wrote a Recipe/Shopping program. It stores a list of recipes and lets you plan a menu for the week. Then puts together your shopping list for you. I love to cook and it was a great way to control food expenses. With 5 kids and my wife controlling food expenses is important. :-) That was probably the most useful and money saving one.
Besides that I've written:
- Conways game of life in multiple languages. (it's my standard learn this language app)
- eTap an erlang tap testing library
- Test.Tap an lighter-weight simpler to use and set up Javascript TAP protocol testing library (specializes in command line javascript tests using prove from perl)
- A templating engine (what programmer in web dev more than 5 years ago hasn't built one of those?)
- Lots of other libraries of useful stuff I can't list right now.
Flight logbook, freefall calculator (after years of jumping and not totaling all those seconds of freefall time got curious how long I've been in freefall, literally ;-) should make a full blown skydive logbook out of it.
Too many to list. I've probably written more code for myself than all the code I've written for all my previous and current employers combined. Among the more notable highlights that I really, really like:
My own web server. Fully HTTP/1.0 compliant and almost HTTP/1.1 compliant - the only thing not implemented is chunked transfer encoding. I learned a lot about script kiddies and worms from doing this (when you're merely USING one, most hacking attempts are simply ignored and don't get logged).
My own console text editor: http://wiki.tcl.tk/16056. I use this a lot. I wrote it simply because I hate the fact that all other console text editors break convention when it comes to use and feel. I mean, all GUI editors use Ctrl-S for save, Ctrl-F for find, F3 to find again, etc. Why do console editors insist on ignoring this?!
Scrolling LED display. OK, this one is both software and hardware. I built it mainly to impress my co-workers (one of whom immediately rose to the challenge and built one that's not only larger but tri-color to boot!).
And about a couple dozen more large, multi-weekend projects. I'm not even counting the small did-it-during-lunch-hour projects like my batch thumbnail generation script etc.
In our grade 12 computer class, we had to write an application that would encrypt a file by taking the first letter of a password, xor'ing it with the first character in the file, then the second letter of the password with the second character, and then just keep rotating through the password.
That night I was thinking, if the text was long enough and you knew the most common letter was E (and you knew how long the password was, say 5 chars), you could take the 1st, 6th, 11th, etc. chars from the encrypted file, count the highest occurrence, assume it was an E and figure out the password char used to encrypt it. So I wrote it... but it turns out I was completely wrong - obviously the most common character in the file was a space, which actually made it extremely easy to use this method. In order to find the length of the password, I just had it attempt with a length of 1, show the result, and you just kept hitting the spacebar (making it try a password one character larger) until the result was readable.
Used it to tell everyone what their password was the next day at school.
Both of these were in Django:
I have a logger which I use consistently.
I also have a commenting system -- basically it lets me track code updates for local histories and builds (between SVN comments)
There are a lot of .bat files I use daily -- most commonly, I wrote a command which force terminates Windows (a beefed up version of using the Windows button to call shut-down). I also wrote a .bat file once which compiles a list of .fla files and then pumps them into Flash so that they can be easily turned into SWF's. That's saved me probably as much time as it took to build it, but just barely.
- iTunes to Banshee ratings transfer
- BT Transmission "auto-stop when finished"
- Stackoverflow Google Chrome extension
- "Auto-Reload" extension for Chrome
- Garage doors monitoring (uses Phidgets devices)
- Erlang Port API library
- Inter-thread messaging library
- Mindmeister automated backup tools
- Gliffy diagrams automated backup tools
- Feedburner Awareness Data to RSS
- 100's of Mediawiki extensions
- AOP library for PHP
State-Machine design library for Python
etc.
I have a big familly and for christmas we can't buy a present for everyone. So we have decided that everyone must buy a present to only one other person of the familly. That's a kind of present sort.
We have some rules to follow (can't buy for his wife or husband, not to the same one than the year before, keep the secret about who is yours....).
Moreover, we have people in different locations and it was a big headache to have everybody a few weeks before christmas to organise this present sort.
So, I wrote a tool to randomly make this sort, to check all rules are ok and send an email to everyone. I've done it with a python script and hopefully it works... everyone gets a christmas present.
I wrote a load of dashboard widgets for the Mac from Man pages, Vi, Grep, SED+AWK etc just so i could reference them (and to learn Dashcode). To my surprise they are on quite a few site and as far as i can tell, not all site produce metrics, several thousand downloads as ell.
I once wrote a mobile (J2ME) determinant calculator (for matrices), but I discovered a bug in a rare case, which happened to be my exam problem..and I had to solve it by hand (correctly, as it turned out).
(And of course many more programs of less interest.)
Power Hour (or Century Challenge) party game. Basically it pauses music playback on your computer every 60 seconds and reminds you to take a shot or drink your beer. We probably use that one too much.
Mileage calculator in J2ME for girlfriends leased car. Every time she fires up the app it shows her the maximum amount of total miles for that day so she can easily compare it with the odometer and tell if she's over or under.
After seeing the Millenium TV series I decided to write my own Y2K countdown timer. I wrote it in Pascal and it displayed the days left until 2000 at boot time.
I've written a few things over the years: a regular expression tester, a property generator for C#/VB.NET, a password generator, some photoblogging software, a web based sql server explorer tool, an iTunes playlist utility(did that way back, should still work though) and a time tracking tool.
I've had a lot of fun and learned a lot writing my own tools. It gives me no shortage of pleasure to see other people using my stuff of thought.
I must have written 4 or 5 personal movie databases over the years. One day I'll write the ultimate one. If for nothing else it's fun to see how ones programming skills evolves over the years.
Outside of university?
So many things! Some that I can remember:
In Delphi 7 I wrote an app that displays the time much like this clock; a little tool for learning how to pronounce Japanese number 1 - 10 and an artificial neural network designer.
In QBASIC I've written a space invaders clone.
In C++ I've written a little programme that (using OpenGL) displays an L-System where each node's position is affected by that of the other nodes (that's here).
In C# I've written an app that takes in a string and outputs it in binary in ASCII, unicode or UTF-32 encoding.
There's loads more. Most of them aren't that usefull!
A small program to store simple text notes/thoughts/snippets/URLs, with keywords for quick searching later, and a command line copy program that accepts URIs for source/destination as well as local files - easy for putting in a batch file or something.
Thinking of doing a explorer/file browser application soon as the standard Windows explorer is continually annoying me, and none of the other 3rd part ones are done how I'd like.
Wrote a python web parser for http://www.reddit.com/r/pics/ it parses 25 links, and inserts them into a new webpage with the comments in a iframe "above the picture". Comments are usally just as good as the picture itself.
And then it loads up all 25 pages in new tabs in firefox... basicly, this saves me ALOT of mouse clicks. 1 button to open 25 new tabs with comments/images.
Lazy person solves very important problem... ;(
Cobian Backup was created to solve my needs, but the beast has grown out of control.
A MDI (Multiple Document Interface) Notepad clone in .Net
- to learn how MDI works
- to learn OOP in C#
- to get a feel for the .NET libraries
Moving from a PHP web development background to C# desktop background was a bit of a shock. Surprisingly, I had a working version with all of the basic functionality (open, save, close, print) in about 5 hours.
A Javascript collapsible tree menu on my desktop
It used an XML file to store the links in a semantic structure
The sections included:
- quick shortcuts to the folders I used most for work
- quick shortcuts to the folders I used for play
- links to open mindmaps I used for reference or track work progress
- links to the remote production webserver, local testing webserver, phpmyadmin, etc...
- links to online references I used most
- links to commonly used applications
I deeply loathed the 'Start Menu' back when I used Windows because it was so slow and unproductive. I wanted to be able to access the stuff I was constantly using in no more than two clicks.
For as long as it took me to write and implement it, it saved me many magnitudes more time that I would've wasted clicking through Windows explorer. Unfortunately, one of the windows updates broke active desktop and I could no longer use it.
I wrote an application in which I can save my notes. Tags are created from the notes implicitly. Then thought it would be a good application and now it is hosted at