Category: Geekery

Run a query for every table in a database

Ever wished you could run a dangerous query like DROP TABLE or TRUNCATE against every table in a database in a single query?

No?

Well, how about something like CHECK or REPAIR table, then?

If you ever find yourself in the rare situation where you need to run the same query across every table in a database, this procedure might make your life easier:

DELIMITER $$
CREATE PROCEDURE `p_run_for_each_table`(IN strDatabase TEXT, IN strOperation TEXT)
    DETERMINISTIC
BEGIN
	DECLARE strQuery TEXT;
	DECLARE strTable VARCHAR(255);
	DECLARE bDone INT DEFAULT 0;
	DECLARE TableCursor CURSOR FOR
		SELECT `TABLE_NAME`
		FROM `information_schema`.`TABLES`
		WHERE `TABLE_SCHEMA` = strDatabase AND TABLE_TYPE = 'BASE TABLE';
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
 
	OPEN TableCursor;
 
	REPEAT
		FETCH TableCursor INTO strTable;
 
		SET @QueryThatWasPassedIn := REPLACE(
			REPLACE(strOperation, '{?database}', strDatabase)
			, '{?table}', strTable);
 
		PREPARE Statement FROM @QueryThatWasPassedIn;
		EXECUTE Statement;
	UNTIL bDone END REPEAT;
 
	CLOSE TableCursor;
	DEALLOCATE PREPARE Statement;
END$$
DELIMITER ;

Useage

The procedure takes two parameters. The first one is the name of the database whose tables you want to run the query for.

The second is the query you would like to run. The strings "{?database}" and "{?table}" will be replaced with the database and table names.

CALL p_run_for_each_table('databasename', 'SELECT * FROM {?database}.{?table}');

What queries you can run

You should be able to use any queries that can be run in a prepared statement – you can find the list about two-thirds of the way down this page.

As of MySQL 5.1, you can run these queries: "ALTER TABLE, CALL, COMMIT, CREATE INDEX, CREATE TABLE, DELETE, DO, DROP INDEX, DROP TABLE, INSERT, RENAME TABLE, REPLACE, SELECT, SET, UPDATE, and most SHOW statements."

No Comments

Logical errors in queries: DO NOT WANT

During my career developing database-driven software (teehee, I'm a professional) I've noted that the most horrific query errors are the logical ones – queries that parse correctly, and return reasonable-looking data, but make wrong assumptions about how different parts of the query relate to each other.

One particular error that I've seen time and time again (even from people who have been writing queries for a while) can occur when summarizing data from multiple tables that have a one-to-many relationship.

…In other words, it could occur in queries written for most database-driven software.

Solution: fix the problem by writing about it!

I wrote a page documenting the cause of the logical error, doing my best to warn people against letting it slip into their own code.

I attempted to write it so it would be easy to read, possibly even entertaining (a lofty goal for a manual on writing database queries, perhaps) – there is some colorful language and plenty of juvenile humor mixed with the tech-speak.

The doc itself is part of the wiki of the company where I work. I don't write a ton of documentation for our developers or customers (certainly not as much as I should), but whenever I do, I get this awesome feeling of usefulness. Oh, and pride. Sometimes, I feel so proud, that I feel compelled to link other people (who have no relationship to my company) to what I wrote! Ridiculous, I know.

Remember: if you write queries, it is your responsibility to guarantee that they return true and accurate data!

No Comments

Convert blocks of text to sentence case

You know what I hate? Paragraphs of capital (or all lowercase) letters.

The other day a coworker was looking to beautify a large quantity of data spread across some MySQL tables.  I created this function to make his life easier:

DELIMITER $$
CREATE FUNCTION `f_sentence_case`(strInput TEXT, nMinimumLength INT) RETURNS TEXT
DETERMINISTIC
BEGIN
 
	DECLARE result TEXT;
	DECLARE LastSpace INT;
	DECLARE NextSpace INT;
	DECLARE NextSlash INT;
	DECLARE Word TEXT;
	DECLARE NewSentence INT;
	DECLARE PreviousCharacter CHAR(1);
	DECLARE TrimmedWord TEXT;
	DECLARE NumberOfSpaces INT;
	DECLARE Swap INT;
 
	SET strInput := CONCAT(strInput, ' ');
	SET result := '';
	SET LastSpace := 1;
	SET NextSpace := LOCATE(' ', strInput, LastSpace + 1);
	SET NextSlash := LOCATE('/', strInput, LastSpace + 1);
 
	SET NextSpace := IF(LEAST(NextSlash, NextSpace) = 0, GREATEST(NextSlash, NextSpace), LEAST(NextSlash, NextSpace));
 
	label1: WHILE NextSpace DO
 
		SET Word := SUBSTR(strInput, LastSpace, NextSpace - LastSpace);
		SET PreviousCharacter := SUBSTR(strInput, LastSpace - 1, 1);
		SET NewSentence := LastSpace = 1 OR (NewSentence AND PreviousCharacter = ' ') OR PreviousCharacter IN('.', '!', '?');
 
		SET TrimmedWord := LTRIM(Word);
		SET NumberOfSpaces := LENGTH(Word) - LENGTH(TrimmedWord);
		SET Word := TrimmedWord;
 
		# Make it lowercase if it is all uppercase
		SET Word := IF(LENGTH(Word) >= nMinimumLength AND Word NOT REGEXP '[0-9]', 
			IF(NewSentence,
				CONCAT(UCASE(SUBSTR(Word, 1, 1)), LCASE(SUBSTR(Word, 2, LENGTH(Word) - 1))),
				LCASE(Word)
			), 
			Word);
 
		SET result := CONCAT(result, REPEAT(' ', NumberOfSpaces), Word);
 
		SET Swap := LastSpace;
		SET LastSpace := NextSpace;
		SET NextSpace := LOCATE(' ', strInput, Swap + 1);
		SET NextSlash := LOCATE('/', strInput, Swap + 1);
		SET NextSpace := IF(LEAST(NextSlash, NextSpace) = 0, GREATEST(NextSlash, NextSpace), LEAST(NextSlash, NextSpace));
 
	END WHILE label1;
 
RETURN result;
 
END$$
DELIMITER ;

What it does

It seems to perform generally as I hoped it would; which is to say that it formats text to be sentence case.

More specifically, it alters all the "words" (a set of non-numeric, non-whitespace characters) that are longer than the specified minimum length.

It changes the words to be all lowercase, unless they happen to be the first word after a punctuation mark (in which case the first character of the word is made uppercase).

Useage

To clean up a field so that it is formatted in sentence case (ignoring all words with less than 3 characters), simply run this query:

UPDATE `table` SET `field` = f_sentence_case(`field`, 3);

Other than that, my only specs for the query were for it to be functional and hopefully not break my brain when I went back to read it later. If anyone has any significant improvements to it, let me know!

No Comments

Running my first campaign!

Less than a year ago, I jumped off the high-board of nerdiness into the deep end of the role-playing pool – and ran my very first campaign.

I wanted a fun campaign (duh) with rules and story that would be hard for me to mess up.  For most of the campaign, the only players were two good friends with solid role-playing experience, so I was able to rely on the players to contribute a good amount of quality.

The story

I took a stab at running an old-west campaign, borrowing every western-movie trope I could think of.  The PCs played gunslinging lawmen for hire, riding into a town oppressed by a gang of n'er-do-wells populated with plenty of tobacco-spitting, expendable, no-good outlaws to gun down.

Without going into too much detail: the players cleaned out a counterfeiting operation in an old widow's basement, were recruited to clean up the town, used aggressive negotiations to get rid of gang members harassing the mayor's house, and stopped another group of enforcers who were coercing money from some water-starved farmers.

Back in town, they took over the town prison, had a gun fight in a booby-trapped house, escaped just as it blew sky high, confronted the aristocratic gang leader on the porch of his ranch house, and finished with a gun battle on main street.

The system

At the recommendation of an experienced GM, I used the Boot Hill (second edition) rules, a creation of Gary Gygax and Brian Blume.

I was looking for super-lightweight rules, so I didn't even use the full rules set described by the Boot Hill book – the only dice rolling during the campaign happened during combat.  Boot Hill gun combat is simple:

  • The fastest draw (based on weapon speed and personal speed) goes first
  • Roll percentile dice (based on your weapon, personal accuracy, and a relatively short list of modifiers) to see if you hit:

  • Roll percentile dice on a wound chart to see where you hit:

Mortal wounds kill you.

Any wound at all gives you a -5% chance at getting to shoot first, and also to hitting the other guy.

Once your strength drops below 50% of what it is normally (which can often be done with a single serious wound), you start getting -20% to shooting first, and hitting.

It's a simple system, but one that facilitates characters dying pretty often.  A couple good rolls, and a single shot can permanently take out any character – even if he just rolled into town with a new bandanna and a pocket full of hit points.

Wait, easy character death?

I wanted my players to enjoy a good old-fashioned movie version of the wild west.  They were supposed to play the heroes – the guys who go flying through bar windows and come up swinging!

I wanted quick and dirty combat, but I wanted my PCs to be a bit more survivable.  I tried a few things to counteract the cheapness of life:

Giving the PCs slightly better stats

Standard nerfing – most of my NPCs would drop below half strength after one serious wound (which severely limits a character for the rest of the combat).  The player characters could took at least two (non-mortal) wounds before things got really sticky.

Making healing much more trivial than the rules suggested

According to the rules, healing is a fairly slow process, taking days or weeks to recover from any sort of combat wound.  My player characters needed to be able to get into gun battles every few hours – they could be rejuvenated by a good night's sleep, or the restorative powers of a kindly old lady's stew.

Adding a new game mechanic

I decided to take a hint from the awesome and successful video game Left 4 Dead.  In that universe, survivor characters who go down are immobilized, but can still fire handguns until their teammates pull them up (or the zombies fill up at the brain buffet).

Any time one of the PCs took mortal damage, I did something similar – instead of the characters dying, they dropped to the ground and could fire their handguns at a reduced rate.  If another player made it over to them and used a round to pull them up, that character could enter the fray with some of their strength restored.

It wasn't a mechanic that saw a lot of use, but it turned several potential defeats into narrow victories.  I was happy with this – narrowly beating the baddies is a lot more exhilarating than seeing one side gun down the other like dogs.

Also, I'm a noob

I found it a highly enjoyable experience, but there were weak spots.  The campaign was fairly light on dialog, which isn't necessarily a bad thing – I just wish I were better at having a conversation in character, and thinking on my feet.

My weaknesses were most evident in the final session, where my PCs held the big baddy in prison and were looking around for a way to prove his guilt (they were lawful, after all) or uncover the next plot hook.

I left them wandering around looking for a clue far too long before I initiated the next action for them to deal with.  They grilled the prisoner for some time (good roleplaying, at least), looking for the magic words that would advance the plot.  Blah.

I think I might try this again

I was very glad to have such great (and forgiving) roleplayers in my campaign.  When the GM is fresh, there's a lot less room for noobs or troublemakers.

I'm definitely sold on lightweight rules sets, especially when going for a more cinematic feel.  The less of a barrier there is between the players and the cool things they want their characters to do, the better.

I have a suspicion that we might try this (noobs GMs practicing with friends) again sometime soon – if you have any suggestions for easy-to-pick-up gaming systems, or good scenarios for some one-shot sessions, then surrender your knowledge to my gaping mind-hole!

1 Comment

Why I still won't use Facebook for everything

With their most recent update, Facebook has suddenly become a more viable place for me to post all my thoughts and opinions.

However, I'm still not a big fan of it when it comes to seeing other people's content.

The problem

Facebook shoves too much information down my throat, even if it's about people I care for.

The way it works on the rest of the internet

The things that you can post on Facebook (blog posts/notes, status updates, photo albums, sharing links) can all be released on other services.

Other people can subscribe to each of those sites individually – if someone posts interesting status updates, I follow them on Twitter.  If they take cool pictures or write insightful blog posts, I add those respective feeds to my RSS reader.

I follow only the things I am interested in – and because I can be picky about what I follow, I end up reading everything that comes through those feeds.

Facebook doesn't let me choose

The recent Facebook update gives the content providers (you and your friends) control over who CAN see certain information.  This is definitely useful, and I appreciate it.

But I don't get many options about what information I see in my news feed – if someone else publishes information to their feed, my only options are to

  • Block ALL information from that user, and not see anything they post
  • See every single thing they publish to their feed
  • In the case of third-party apps, I could block the application and not see any information from that app, for any user.

If I have a friend who makes really funny status updates and posts a ton of photos to their Facebook album, it's all or nothing for me – Facebook doesn't let me select what I'm interested in seeing from the other user.

As a result, my Facebook feed is full of information ranging from interesting content to wastes of pixels.

I don't roll that way

I consume a lot of information over the internet – My feed reader tracks over 150 feeds the last time I checked, and I follow over 100 people on Twitter.  And I read almost every piece of information that comes through those feeds!

I can do this because I am picky about what I follow.  If I'm not sure that at least 95% of the posts in a feed are going to be interesting to me, I don't follow it.

If a blogger, Twitter user, or photo album is publishing more than a few new items per day, I don't follow it (no matter how interesting it is) because my feed reader would get too cluttered, too quickly.  I wouldn't be able to keep up.

It's not the fault of my friends

Well, not most of them, anyway.  Some of them do post really stupid stuff to their feeds.  But I can block those users without feeling bad.

Let's say I take pictures of local scenery fairly often, and upload them to Facebook photo albums.  Facebook photo permissions are set per-album – I would probably have an album set up to be publicly viewable to everyone (because why wouldn't I share those pictures with whoever was interested?).

Now, when I upload the pictures, I have an option to share them with people.  When I do this, the photo will show up in their feed (unless they've blocked me).

At this point, the responsibility is all on me – which of my friends would be interested in a photo of a sunrise just starting to brighten O street? I can share it with a specific group of people – maybe I even set up a list of people who I know like photography, and only post the new pictures into their feeds.

But those people don't get any say in the matter – if I post my new photos in the feeds of everyone on my friends list (which is the way Facebook has worked historically, and still acts by default), then those photos will be cluttering up their feed.

And if I try to be considerate, and only announce my newly discovered art to the few people I think would be most interested, then other people could be missing out – if I have friends who are actually interested in these photos, but I am not aware, I could very easily leave them out of the loop. And there's nothing they can do about it.

Facebook really wants to keep people happy

They're trying so hard to give people the tools they need to share their information reasonably.

I can understand why they're making the security so granular (so much so that it's getting really confusing to administrate) – security is something that almost everyone is concerned with, and a small group of people complain VERY loudly about.

But there's more to social networking than security

For people who care about the information they consume (and want to consume as much as possible), security settings do nothing.  They don't even matter.

If I'm not allowed to see someone's photo album, I don't care in the slightest – the only thing I do care about is whether or not I can filter the information that IS available to me, so that I only see things that are guaranteed to be worth my time.

And until Facebook lets me do that, there's no reason to consider using it as one of my primary social networking tools.

No Comments

In a shocking twist, I'm interested in Facebook again

At the beginning of the month, the founder of Facebook published a happy post about some upcoming changes to the site.  About a week later, the changes were rolled out.

What did they do?

Facebook users get more choices about who will see the content they put online.  Here are my current settings:

Facebook Privacy Settings 2009-12-14

However, there are still some catches – third party applications have the ability to see all the users who you are currently friends with, and you can't do anything about it.

Facebook used to be way lamer

Until this change, Facebook wasn't (in my mind) a great place for me to put content on the internet.

When you're sharing information of any sort with other people, there are a few things you should take into account:

You don't always want everyone to know

Having trouble with the spouse?  Angry with your boss?  It's natural to look for a shoulder to cry on, but you really shouldn't be sharing those sorts of details with just anyone.

There are entire web sites devoted to making fun of people who posted private or embarrassing information for all their Facebook acquaintances to see.  If you're wise, you keep those sorts of things to yourself.

You might want EVERYONE to know

Maybe you added a hilarious caption to a picture of a cat – maybe you wrote an eloquent post exposing the truth about that one professor everybody likes.  There are some things that just need to be shared with the world, you know?

In the past, Facebook was not the place for such coolness – that witty status update would only ever be seen by people who knew you in some fashion.

Not everyone cares

My Facebook status updates are currently pulled straight from my Twitter feed.  I try to make posts that have some kernel of interest to people with similar interests to mine – even if they don't know me personally.

This results in a lot of status updates that are confusing or uninteresting to people who actually are my friends – my mother really doesn't care if I'm looking for someone to play L4D2 with (let alone know what it stands for).

In the interest of keeping my status feeds accessible, I also avoid posting things with a limited appeal.  I could announce every new band I discovered, but few people would actually care.

As an aside, I've noted that most Facebook users seem to have no concept of this – they post any update that occurs to them, regardless of how little I may care.  (The nerve of some people, right?)

Facebook finally reflects reality

If you're one of those responsible people who are conscious about your audience when you say things on the internet, Facebook is now a lot more attractive.  Now, everything you add on that site can be filtered based on whether or not you want certain people to see it.

Until now, these aforementioned responsible people have generally taken this content elsewhere – either to a public site, where people who are interested in your content voluntarily choose to follow it, or by taking their private conversations to email or private chats.

It's especially important that certain information be public

I don't personally care that my friend list is publicly available to anyone who writes an application that accesses Facebook – though on principle, I am annoyed that there is no option to keep that private.

I do understand why Facebook would want to make this sort of information available to outside sources, though.

Other people can do useful things with that information

Since it's popularity explosion, Twitter's web site has had a pretty small feature set.  You could make posts, pick people to follow, and access other people's posts and follow lists.  You could even pick some posts to be your favorite posts – but not a lot else.

But Twitter has become highly popular (particularly to the nerdy crowd), in part because:

  • Almost all the information is public – very few people choose to make their profiles private
  • All of that public information is easily accessible to anyone

Anyone can write a handy application or web site that does something cool with the information people put on Twitter.  You have access to things people have said, and the the things that they're interested in seeing.

If you're the sort of person who likes to derive a useful meaning from large quantities of information, Twitter is a dream come true.

I haven't looked into Facebook's API at all – I don't know how simple it is to access information as a programmer.  But as a developer, having access to more information instantly makes Facebook more attractive to me when I'm looking to write an application to analyze the differences between high school cliques and college cliques (or whatever).

Facebook wants to be the definitive social network – but for some time, Twitter has been the most attractive place to get social networking data from.  I can see why Facebook wants to draw the line where they have, and I don't blame them.

No Comments

My accomplishment for the day: a MySQL quine!

Some background: a "quine" is a program that outputs it's complete source code when run.

Some more background: I work at a company where I work with MySQL (a database engine) very often.

I was lounging around in the MySQL chat room on irc.freenode.net, and someone suggested that I try to write a MySQL quine – a database query that would return the text of the query itself.

After about half an hour of screwing around, I got it! It may not be a fantastic achievement, but I feel pretty leet about writing my first quine in a database query language.

SELECT REPLACE(@v:='SELECT REPLACE(@v:=\'2\',1+1,REPLACE(REPLACE(@v,\'\\\\\',\'\\\\\\\\\'),\'\\\'\',\'\\\\\\\'\'));',1+1,REPLACE(REPLACE(@v,'\\','\\\\'),'\'','\\\''));

Only 167 characters. Hah!

No Comments

What is software worth, eh?

A discussion rages (in many forums, at this moment in my hotel room) about What Software Is Worth and What You Are Paying For When You Buy It.

There are many philosophical arguments (going on in this hotel room, even) but I am going to give my opinion as a consumer here.

To me, as a person who buys software, I see it this way: I am paying someone to get software. Sometimes I pay the person who made the software. Sometimes I pay someone who happens to be publishing the software.

Once I pay someone to get the software, I should be able to do what I want with it. I am willing to pay for support of that software and other services (online play, ahoy).

A software producer may think they are selling me a license to use their software (on N number of computers, perhaps), but whenever they try to enforce that, I generally find myself inconvenienced.

If I find that the cost that the publisher/producer expects me to pay for the software is more then I am willing to pay, I will generally disregard what they want and get the software from someone else (or use the original software in a manner that the producer/publisher considers illegal).

This may include using one license on more computers then they expected. Or downloading their software using bittorrent.

No Comments

How do you read the internet?

Until recent years, I had no particular method of digesting the internet. There were a couple blogs that I would check on every once in a while to see if there was any new content, and I had 5-10 webcomics that I would visit about daily to check for new episodes.

I found new content mostly by word of mouth, or by specifically searching for something that I thought might exist. How backwards I was!

I've improved my content discovery and digestion methods somewhat since then. My first step was to venture into the world of RSS feeds.

Any web site worth its salt that releases content regularly (on a schedule, or not) has an RSS feed these days. You don't have to worry about what it is, all you need to know is that it tells your RSS reader whenever there's something new for you to look at.

What's an RSS reader? Why, it's simply a handy application that you give RSS feeds to so that it can hold on to them, and let you know when there is something new for you to read. Personally, I use Google Reader.

If you notice yourself visiting any web page to check for new content – trust me, you're doing it wrong. An RSS reader allows you to compile all of the web sites you want to keep up on, so that instead of spending time loading all those web pages you're interested in every day, you can just read up on all the updates that you haven't seen yet.

When it comes to discovering new content, I personally use StumbleUpon – a social networking site without the annoyances that come from interacting with strangers on the internet. You start off by selecting any set of topics that you're interested, and you're ready to Stumble.

Any time you want to see something new, you just click the button inside your browser (it shows up on a toolbar plugin). It takes you to a highly-rated web site that you have not seen on one of the subjects you were interested in. You have the option to indicate whether you do or don't like the site.

I've stumbled on many blogs, webcomics, funny pictures, funny videos, useful applications, and other random web sites that I would never have found without StumbleUpon. If you want to get more out of the internet, I'd reccomend it.

No Comments

Piracy and the consumer

I get most of my movies and music from other individuals on the internet using bit torrent technology.

I don't do this as a statement against "the man" (as much as I do loathe him), or because I am so poor that I have no other options. I choose piracy as my primary means of acquiring media because it gives me the best return for my input.

There are 2 things I consider when spending money on entertainment (mostly music, movies, video games). How much enjoyment I get out of it (or think I will get out of it) and how much investment it will take to get that enjoyment.

Using this formula combined with my own personal constants of what things I generally enjoy and what resources I have at hand, many of the regular options for media consumption don't make the cut – watching a movie in theaters costs around $8 in my city now, not to mention the investment of time spent finding parking. Plus I can only watch a movie when the theater feels like showing it, and I can't drape myself across a couch while enjoying it.

Television programming also falls short – I'm not willing to invest 1/3 of my media-viewing time watching advertisements (which aren't even being targeted to me personally!).

Purchasing DVDs is a reasonable option once in a while, but very rarely. It is not very often that I expect to get full retail price worth of enjoyment from any DVD movie.

Now when I talk about enjoying a movie, it's not always all selfish gratification (honest!). I am motivated, as a capitalist consumer, to support those who produce high-quality products with my hard-earned dollar. But in Duff-Land, the "media I support" budget is pretty low compared to the amount of media I consume.

At this point in my life, I would be willing to donate around $20 a month to those whose works I had enjoyed that month. If I was paying full retail for price for all the movies I enjoyed, I would probably be paying closer to $100 a month.

So what are my options? As far as movies go, Netflix is a great option. Excellent selection of movies, and for your convenience, many films are now becoming available to stream over the internet and watch within minutes. For less than $20 a month, you have some solid options for watching movies.

When it comes to music, I'm harder to please. I would be willing to pay about $5 for an album I enjoyed – and I don't mean a 5-track album. iTunes is a popular option, but (besides being more than I would like to pay), I would want to be able to download higher-quality tracks (most of their tracks are 128kbps), and I will not pay money for anything infected with DRM (Digital Rights Management, designed to limit your use of the file).

Thus, in most cases, I turn to piracy. I download my movies and music (and the occasional video game) because nobody is willing to take what I'm willing to pay for their goods. It's not that I don't want to pay the fine actors and writers of the television series House, it's just that I'm not going to pay $120 for the right to watch the first 3 seasons at my own convenience.

Not long ago, Nine Inch Nails released the Ghosts I-IV, four volumes comprising an album. Instead of releasing their album in a traditional way, the first volume was released for free on torrent tracking sites such as thepiratebay.org. The entire album was available to purchase from the official website in several different formats. One of the formats was digital download – for $5.

Now, a newly released 36-track album for $5 is a heckuva deal by most media standards. Plus, the tracks were available in several different high quality audio formats (including lossless) without any DRM attached.

I loved the idea, and purchased the digital version. The download servers were completely swamped, and I ended up downloading the entire album using bittorrent anyway – but that wasn't the point. I was given the option to pay the artist for his work, without having to worry about a record label skimming off the top.

The album was pretty good, and makes its way onto my playlist reasonably often. But since then, I've noticed a change in how I think of music. I still download albums without a second thought, but now when I find one I really appreciate, my first instinct is to go to the artists web site and PayPal them some money to show my support.

It's pretty annoying, really. I have daydreams about running into my favorite artists at some generic bar and buying them a round of drinks to show my appreciation. I can't afford to buy albums from all of the artists I support, so I'm stuck with my daydreams for now.

Until artists start breaking away from the record labels wholesale and releasing albums in a way that gives their fans better options, piracy will remain the best option for the regular consumer of media in most cases.

No Comments