Categories
tech-talk

My take on Copyright and File Sharing

Creativity depends on a content producer being able to build on what has come before, but it also relies on the producer being protected and entitled to the benefits of his/her efforts.  If I study hard and work tirelessly to become a master musician or a programmer or an athlete, I should gain the rewards for it as well.  Someone who didn’t work to earn it shouldn’t feel entitled to the value of what I produce, and certainly should not be reaping the benefits of what I produce.

So what is free to take without permission and what requires the permission of the producer?  Copyright law makes the distinction between an idea and the form of an idea.  An idea is free to use and is exempt from ownership.  The way an idea is expressed, however, is owned by the person who originates that form of expression.  In my case as a programmer, I can rely on the principles of mathematics – I don’t have to attribute 1 + 2 = 3 to anyone else.  However, I can safely claim my method of applying that math to a specific problem and charge money for it or not.

Speaking of money, what does a purchase mean anyways?  It is a contract between a content producer and a content consumer, the consumer compensating the producer for the value they get out of the content.  Like any contract, it is subject to the intentions and interpretations of both parties.  If the value a consumer gets from the content is outside of the intention of the producer, does the consumer infringe on the producer’s right to the content?

I would argue that yes, the contract should be adhered to by both the consumer and the producer.  So in that case, who should enforce the contract?  Besides that consumer having an ethical obligation to the contract, the producer should be able to protect his/her legal right to the content. 

The government and industries representing the content producers have tried to make it easier for producers to safeguard their rights to their content.  Their efforts were unpopular, but have made it general knowledge that certain forms of file sharing are illegal and may be prosecuted.  If there is a complaint to be made about these efforts, it has to be that consumer behavior is intelligent and requires finesse.  The online community appreciates respect and disdains force, and lawsuits and subpoenas and file encryption are the exact opposite way to achieve compliance. 

The success of Radiohead in asking for as much as the fans were willing to pay for their album rather than loading their songs with DRM represents a contract in which both the consumers and the producers win.  In this model, the producers make their money, the consumers are respected and, most importantly, the contract is honored – no enforcement necessary.

Do I have it right?  wrong?  What do you think about copyright and file sharing?

 

Radiohead article:

http://musically.com/blog/2008/10/15/exclusive-warner-chappell-reveals-radioheads-in-rainbows-pot-of-gold/

Categories
geek

URLs, Models, Views, Templates, and Shell – Useful Snippets for Each

There have been quite a few times when I have resorted to my coding friends and mentors and good ole Prof. Google to teach me how to write the code I needed to get the job done.

In particular, Adam (@adamjt) and Andy (@ashearer) have been right there alongside me helping me out.

Learning Django has been particularly involved because there are so many “in” things to know.  My understanding of Django has come down to the fact that there are 5 things to master in order to code Django and python successfully – the urls, the models, the views, the templates, and the python shell (command line interface).  I’ll touch on each one and list something I didn’t get at first until my friends explained it to me or I found it on google.  It is written in the spirit of writing it down so I don’t forget it …

URLS:   All about the media … explained to me by Andy (@ashearer on twitter)

In order to link my templates to the site media such as images and javascript and all that fun stuff I had to follow some specific steps in a very un-PHP manner:

  1. put a special global variable in the settings file of my project:
    MEDIA_URL = ‘/site_media/’
  2. add an extra expression in my urls file:
    (r’^site_media/(?P<path>.*)$’, ‘django.views.static.serve’, {‘document_root’: os.path.join(os.path.dirname(__file__), ‘site_media’)}),
  3. make a directory on the same level as my urls and settings files called “site_media” that holds all my files (which can then contain subdirectories for css, images, javascript that I can include in my links in the template)
  4. link to the MEDIA_URL in the template itself, like so:
    <link href=”{{ MEDIA_URL }}your_stylesheet_name.css” type=”text/css” rel=”stylesheet” />Notice that in the template itself, the {{MEDIA_URL}} is a reverse look-up.  There’s no need to write out the exact relative path to the site_media folder.

MODELS: Optional ForeignKey attribute … explained to me by Adam (@adamjt on twitter)

When I specify a one to many relationship in my models file using an ForeignKey, sometimes I want that relationship to be optional.  Just blank=true or null=true doesn’t work though, you have to use both:

mynamedattribute = models.ForeignKey(MyModel, blank=True, null=True)

This is an optional field, not required, as ForeignKey fields usually are.

VIEWS: Authenticate me … Adam and Django Docs (@adamjt)

Logging users in and out is quite the hassle, but there are some built-in methods that take care of the work for me.  In order to get a user logged in and out, there needs to be a url side of it, a view side, and a template side.  There are more advanced registration and authentication modules out there ( Google code has one I recommend http://code.google.com/p/django-registration/ ) but there are also some short-cuts that come with Django that work very well.

  1. On the urls side, these are the urls that link to the views that are built into django to log users in and out:
    (r’^login/$’, ‘django.contrib.auth.views.login’),
    (r’^logout/$’, ‘django.contrib.auth.views.logout’),
    Teeny sidenote here:  there was a release of django that had the login template moved from registration to admin but referenced the old location in the view, so to fix it I took the non-coding way out and copied the template over to the proper directory
  2. For views that need authentication, “login_required” is an easy way to check for logged in users.  The view file first imports the necessary decorators:
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth import logout
  3. Then the view can either start with login_required:@login_required
    def view(request):
    variable_name=processed_variable
    return render_to_response(
    ‘index.html’,
    {“ElementName”: variable_name}, context_instance=RequestContext(request))
  4. or it can use “if request.user.is_authenticated” within the view (if it came from a login form it will look like the code below):
    def otherview(request):
    if request.method == ‘POST’:
    if request.user.is_authenticated():
    variable_name=request.user.username

    else:
    variable_name=”Not logged in so no name”
    return render_to_response(
    ‘index.html’,
    {“LoggedInName”: variable_name}, context_instance=RequestContext(request))
  5. Then in the template there is the same operator for segments of code that should be displayed for logged in users:
  6. {% if user.is_authenticated %}
    <a href=”/account/”>My Account ({{ user }})</a>
    {% else %}
    <a href=”/login/” >Login or Register</a>
    {% endif %}

TEMPLATES:  Ordering output and Grouping … explained to me by Adam (@adamjt)

For an article-based engine, I needed to group a list of articles in order to show them according to category and then by date within the category.  First I had to order them in the view and then regroup them in the template:

  1. The view is simple enough, generate a variable that stands for all objects in class MyArticle in order by category:
    variable_articles = MyArticle.objects.order_by(“category”)
  2. Pass the variable to the template in the dictionary:
    return render_to_response(‘articles.html’, {‘articles’: variable_articles}, context_instance=RequestContext(request))
  3. Then in the template, I make use of the “regroup” template tag to take the already ordered-by-category articles to order them further by date:
  4. {% regroup articles by category as article_list %}
    {% for article in article_list %}
    <h3>Category: {{article.grouper}}</h3><ul>
    {% regroup article.list by date as datedarticle_list %}
    {% for datedarticle in datedarticle_list %}
    {% ifchanged %}<li>{{datedarticle.grouper.date|date:”F j, Y”}}{% endifchanged %}
    <ul>{% for item in datedarticle.list %}
    <li><a href = “/article/{{item.id}}/”>{{item.title}}</a>, {{item.author}}</li>{% endfor %}
    </ul>

    {% endfor %}</ul><br />{% endfor %}</ul>
    Notice that we had to regroup by category aside from using “order_by” in the view, but that was for the purpose of printing out the attribute by which the variable was grouped.

Finally the

SHELL:  Python shell scripts … figured out through pieces on Google

Using the administration interface is nice since you can see everything neatly represented by menus and drop down fields in a GUI, but there are tasks that are more efficiently accomplished using the command line.  Even that has its limit, in the sense that I could only ever figure out how to give it one command at a time.  A shell script on the other hand will give me the efficiency of the command line with the advantage of being able to write out an automated, saveable, multi-command executable.  You do need to have access to a Linux-type terminal in order to do this (the script starts off with the bash shebang).

  1. Create a file called myscript.sh and chmod it to have execute privileges:
    chmod +x myscript.sh
  2. Create the python environment with the python path and the django environmental setting:
    #!/usr/bin/env python
    import sys, os
    # Add a custom Python path.
    sys.path.insert(0, “/usr/bin/python”)

    # replace myname with your username
    sys.path = [‘/home/myname’] + sys.path

    # Set the DJANGO_SETTINGS_MODULE environment variable.
    os.environ[‘DJANGO_SETTINGS_MODULE’] = “myproject.settings”

    from django.contrib.auth.models import User #for example, this can be any django code

  3. Write in any commands you normally would type into the command line, for example making repetitious code into for loops like so:
    for i in range(1,51,5): # where i is the iterator and range(start,stop,step) – stop is non-inclusive
    article=MyArticle.objects.get(pk=i) #to select all objects with indices 1,6,11 and so forth up to 50
  4. Execute the script from your normal command line:
    ./myscript.sh

And there you have it!

Categories
web development

Teaching Mom PHP

“Strings?? Words are called strings in computer lingo? That’s too jargony for me …”  My mom is a newbie, classic right brainer and kinesthetic learner.  She fidgets when she’s in the chair for too long.  She jumps up and down when something works.  And I’m teaching her to code.

She has listened to me talk about all these technologies for the last two years.  Mom attended the NewBCamp I organized in February, playing a vital role in the event by manning the registration desk.  She knew about these terms like PHP, HTML, CSS, and Javascript, but she referred to them without knowing what they meant.  That is, until a few days ago when she decided she would be thrilled to learn how to do some of what I do.

First I introduced her to the tools she would be using and some of the basic terms she would have to know.  “Browser” she knew already, as well as the fact that there are more browsers than the one Internet Explorer that most people seem to use.  I showed her the text editor Notepad++ and showed her how the regular Windows Notepad doesn’t have all the features that this text editor does (although there are better ones out there, it’s good enough for my purposes and light weight and free).  I then explained how the server (we were using Apache) finds the pages written in text and stored in the “document root” and then sends (serves) them to be interpreted by the browser.  We opened up the browser and typed in http://localhost/ and it showed the index page stored in the file folder.  

Mom started her first HTML document with a strict DTD from W3C and titled it “Opus4Jerri”.  I directed her to close all the html tags she started – an html tag goes first, then head next, then within that the title and the link to the css file.  Writing out the css link was a good place to pause and talk about file locations and directories.  The server can’t find a file unless it’s given the correct “path”, which is like opening one of those Russian nested dolls until you find the last file you were looking for.  The path starts with the drive you are in – in our case the C drive, and then each folder from then on is separated by slashes until you get to the file itself, which has a dot and a “file extension” indicating the type of file.  This is the sort of nuts and bolts information that I take for granted now, but it’s a major barrier to someone who is totally new to how web development works.

None of this was intuitive for Mom.  She worked hard to construct that first html document and was thrilled to see it when it first appeared interpreted by the browser.  We moved on to styling from there, and she played around with the background colors in the css file until she was satisfied she knew how it worked.  Then it was time to add in some dynamic parts with PHP.  The first thing we did was even simpler than a Hello World – she opened with a <?php tag and wrote echo 3-1;  closing with a ?> tag .  This was to illustrate the difference between php and HTML.  When she saw that it rendered as 2, she was surprised but then understood that HTML would have just printed 3-1, while PHP can do the math and to some degree “think” about what we type in. 

I explained that PHP does not show up in the View Source tab in the browser, which disappointed her a little because she had been thinking she could put secret messages in the PHP that only coders would be able to see when they looked at the source.  Only HTML, CSS, and Javascript show up in the browser because they are “client-side”, while PHP (and Python) are “server-side” so they never make it to the browser, whether in the text or in the interpreted (rendered) page.

Mom finally had her Eureka moment when I showed her variables.  In PHP a dollar sign before a word means a variable, which is like a name for a box that you can put a value into and then use the name whenever you need that value.  She said, so that means you can change a value once in that first equals (assignment) statement and it changes all the places where you used that variable.  I agreed that it is a good coding practice to avoid “hard coding”, where instead of using the value itself, you use the variable and then you only have to change what the variable means instead of all the places where the value was used.  Where variables shine, I continued, is in the if – else logic statements that test a variable for how they compare to a value and then do an action based on the outcome of that test. 

We did a simple example that took the current hour using the “date” function in PHP and tested the variable with that hour value against whether it was between 6am and 6pm (or between 6 and 18, as we made it easy and used military time).  According to whether the variable was between the values, it changed an inline style statement to make the background yellow during the day and black at night.  The code looked like this:

<style text=”text/css”>
body {background-color: <?php
$date = date(“H”); // this is the date function that formats the current time by hour in military time
if ($date>=6 && $date<=18) {
echo “yellow;”;
}
else {
echo “black;”;
}
?>
}
</style>

Since it was a little before 8pm when we did this, the background showed up black.  I told her to go back tomorrow and check it and it should be yellow. 

My mom’s response to all this was to decide that she needs to work on it on her own in order to really learn it, which is a great approach.  However she benefited from having someone to help her – for instance at one point she told me she had taken an hour to try to figure out why she couldn’t open a file in Notepad++, and it was because the default text editor was still regular Notepad.  I’ve been through all this, so I can save her time in learning the hard way.  It’s my pleasure, because it helps me rediscover all the nifty little things that make web development so much fun.

Categories
little people

Tweeting as a Life Skill: Customer Service on Social Media

Now this is a first for me – social media network turned lifesaver.  Last Wednesday we had an electrical storm that fried my router.  A word about that storm – intense, lightning every few seconds.

My wireless didn’t work, and since the modem was plugged into the router, I didn’t realize I was online, just my computer couldn’t connect through the router. I was under the impression it was an area service outage – except the outage didn’t end, and no one else seemed to be affected.

A day into the “area outage” I realized I needed to call customer service at Comcast – the ole 800-COMCAST number.  I tried speaking with the random person that came on after navigating the phone menu.  She tried resetting the switch and said it should be working.  Then when I mentioned the service outage she agreed that must be it and told me I could get reimbursed for the time down.  I had a funny feeling that was not the right answer, so the next day I tried calling one of the retail locations near me, found using Comcast’s store locator.  That was quite the dead end, as I was told that unless I needed something installed they wouldn’t be any help.  Keep in mind that my problem was actually not with Comcast, so in a way they were right.  It was faulty equipment, but I was still under the impression that there was something affecting my area, so I wasn’t pulling out wires and figuring it out.

Finally I dared a buddy of mine to dare me to try a post on twitter (or tweet) to the attention of comcastcares, whom I would later affectionately refer to as Frank.  For anyone who might need to know, to tweet to someone’s attention on twitter you post the @ symbol in front of their user name, and the @ plus user name has to be the first word in your update.  Otherwise they probably won’t see it.  This is referred to as “replying” to that person or “atting” that person – yes they call it replying even if it’s not in response to a prior tweet from them.

I tweeted:
@comcastcares alright here goes – I’ve been without the internet since the MA/RI storm & tornado – zip is 02769, called Comcast, no luck “
Within a few minutes I got a reply back:
@saranicole If you DM the phone number on the account I can take a look
For any non-twitter users out there, “DM” means “direct message”, which is Twitter’s private messaging system, accessed using the direct message tab in the sidebar on the home page. Frank proceeded to reset the modem and told me it was online so I should be good to go. However, if I had any further questions I could DM him from home from my mobile phone.

Fast forward to that evening – still not online, so I dm’d him my woe-is-me-still-not-online and within about two minutes the phone was ringing.  It was Frank, and he actually talked me through troubleshooting the equipment.  He cleared up the question I had had about the area-wide service outage – it was actually a cable television outage, which had nothing to do with internet service.  In other words I would have been waiting with no hope in sight under a mistaken impression had I not taken action.  Meanwhile, he concluded the modem was faulty after about ten minutes on the line (this was a mistake, but it was because I didn’t plug in a cable correctly – otherwise he would have undoubtedly figured out it was the router, no problem). I went ahead and bought a new modem on his recommendation and feverishly installed it and called Comcast (the 1-800 number) to activate it.  Still no.  By process of elimination the router was it.  I rushed back to Best Buy (which doesn’t need a customer service twitter patch by the way – I could call their phone number and get a local, knowledgeable person, as opposed to Circuit City which I called first and got nobody, so service really does matter) and bought a fifty dollar router five minutes before they closed.  I hooked up the router and presto – back online, both my desktop and my laptop.

On one hand, companies shouldn’t need a “twitter patch” for their customer service.  When I call I should get a live, local person with the power to help me.  Since I mention Best Buy, their Geek Squad probably could have helped me figure out the problem too.  However for getting in touch with a real live rep from Comcast who could help me, Frank was the man.   I’m going to get a little personal here and challenge Amtrak and Dell to apply the twitter patch to their customer service nightmare.  It may not work for everybody, but it will work for some, and I’m glad not to be a statistic, still waiting for my “area-wide service outage” to clear up.

Additional links:

New York Times article this Friday on Frank and Comcastcares:
http://www.nytimes.com/2008/07/25/technology/25comcast.html?_r=1&scp=1&sq=comcast%20cares&st=cse&oref=slogin

Adele’s blog post on ABC and Twitter users from this Tuesday:
http://www.adelemcalear.com/2008/07/22/abc-sets-up-new-twitter-users-to-be-disappointed/

My conversation with Frank via Twitter:
http://search.twitter.com/search?q=comcastcares+saranicole

Link to my Phreadz post talking about Comcastcares and my customer service experience
http://phreadz.com/p/1R5B4AP7U16/

Categories
tools

Customizable Radio Stations – Rock on

My musical taste has traditionally been pretty limited as I don’t take the time to find artists I like.  Alright, limited is putting it kindly – I’ve been oblivious to just about everything beyond the 80’s soft rock I grew up hearing.  Like, who are the Beatles oblivious – I kid you not.

This weekend I found the tool my sad repertoire has been lacking all these years.  Pandora is the schnizzle – I can now create stations from “seeds” – so I give it an artist or a song that I have somehow discovered despite my lack of awareness of pop culture.  Then the super accurate algorithms kick in and generate other songs that resemble the ones I’ve given it to work off.  As I go along I give certain songs thumbs up and thumbs down which influence the choices.  Basically it gets better and better at predicting my taste so that after about two hours of use it becomes a virtual mind reader.  If I don’t like a song or an artist, I can vote it thumbs down – two thumbs down on the same artist bans the artist from the station.  The only aspect I’ve seen that I don’t like is that there are a limited amount of times that I can skip songs due to license issues.  If I run out of skips I’m forced to listen to something I don’t like even if I give it a thumbs down – I usually end up muting it and letting it run out.  Other than that, great service that will keep me entertained for many hours to come.

How does it compare?  Well I tried Last.fm and I will vouch for the relative poverty of the algorithms they use.  I’ve been using it for several hours and it’s no closer to understanding what I want.  Besides asking me to download a streaming software widget, they keep  insisting that if I want to create basic things like a personal station I have to subscribe to their paid service.  Hey, I just want to stream the music I like – I thought that was the basic service.  I keep trying to get the artists that I want to play on the station and it seems to give me everything but.  Not cool.  The only somewhat decent feature was to let me listen to my friend’s stations.  Even that got poor as I kept going – after several songs it pops up an alert that all the content has been used up.  How does that work – I refreshed the station too and sometimes got more, sometimes got the pop up again.  Whatever.  I won’t be using that again – Pandora’s definitely got my ear, and I’ll be playing my rock and reggaeton happily ever after thanks to them.

Categories
writing

Blogging Passion: Why do I write?

I am so not even a B-lister – and the fact is, I’m not interested in blogging for status among my social media peers.  If I were, I’d have to work harder, for one thing.  Who needs that … so why do I write?

 I write for anyone who takes an interest in me through my other activities and wants to read more about how and what I think. 

There are a few impressions of me that I would like someone to take away once they have read my blog.  True to form, I will make them into bolded subheadings:

Breadth of interest
I am a student, first and foremost.  I like learning and honing new skills.  My posts show a variety of interests and a tendency to challenge myself in different technologies.

Documenting my Activities
I’ve blogged on my projects, such as NewBCamp, in an attempt to maintain a record of what I’m producing with my skills and how I’m participating in the broader social media network.

Showing a Personality
I want anyone who reads my posts to get to know me better as a person.  I have a sense of humor and an interesting take on life in general, so I hope my blog spreads the word about the character that is Sara Streeter.

Passion to Grow
I enjoy writing for its own sake.  Additionally, I find that it sharpens my understanding of myself and my pursuits, giving me a platform for “thinking out loud.”

Success, in blogging as in life, is all relative to the intent.  I hope my blog posts bear witness to the fact that, hey, I’m having fun.

Categories
web development

jQuery, my love …

I have a new fetish (web development fetish, of course) and that would be jQuery.  I had been introduced to it a few weeks back thanks to that most awesome of instructors Hilary Mason (www.hilarymason.com), but now having seen the man himself John Resig present on it at BarCamp Boston 3, I am yet more eager to explore its marvelous functionality.

John Resig’s presentation (to be posted on Youtube before too long, according to kind audience member who thought to record it) was a wonderful overview, going from nuts to bolts in a half an hour.  He explained that jQuery is a Javascript library which, at a minified 15k, provides a way for HTML and Javascript to interact that usually takes server-side scripting to accomplish.  In fact it can act as its own programming language even to the extent of replacing some server-side code. 

Besides enabling cool visual effects such as the toggling of show/hide, accordion drop down menus, and custom animations, it allows manipulation of DOM elements such as your div tags and header tags.  PHP groupies will love the dollar sign syntax, and those who have mastered the CSS #id and .class tags will find learning jQuery an easy transition.

What really perked my ears were two features that I am dying to try out – the AJAX call to load an HTML page and then strip out only those elements that are needed, and the chaining method in which an element is acted upon by multiple events, in a series that looks like this:  div.show().foo().bar() , where show, foo and bar all act on the same element to accomplish their respective functions.

Three books I plan on purchasing in sequence based on Mr. John’s recommendation are Learning jQuery (Packt), jQuery Reference Guide (Packt), and jQuery in Action (Manning) with none other than John Resig writing the foreword.

Interested in learning more about jQuery?  Check it out at jquery.com .  John Resig’s blog is ejohn.org/blog

Categories
unconference

Seesmic, hunh …

Just got back from PodCamp NYC 2, and my new thing is Seesmic.  It’s nifty already, a way to let loose my natural charm and wit on the social media crowd.  I’m impressed with how much more personality one is able to convey through this medium – I follow these people already through twitter, but these video posts have that dimension of fun that isn’t as easy to convey in 140 characters or less.  It is more personal than YouTube, giving the feel of the character behind the content being posted.

So thank you PodCamp for this new time-sink – but it feels so good going down …

Categories
future

The Future! (BETA)

If the future were a website, would it be one of those that perpetually has the sign up “Under Construction”?  When are we going to get some closure on these “Beta” web applications that are down every other week, or the software that will be compatible with my operating system “in a few months”?

 In a “Web 2.0” world, the future amounts to a collage of constant upgrades and updates.  Growth is version-bound, incremental, in the style of a digital clock.  Rather than a cycle, change is a linear spectrum.  The old isn’t old, it’s outdated, and the new is what outperforms the old.  Never stagnating or repeating, if you don’t like the way things are, just wait a minute.

This perception of time is an technology-driven, impatient one.  But if I think really hard I’m able to remember another one, when once upon a time, the future was the gently flowing dream of a life we’ll eventually get to, a la “Row row row your boat.” 

Remember the swell of the shadow on a garden sun dial, or the sweep of an analog watch?  In the natural world, growth is cyclical, based on the rhythms of the body and its environment.   Change, rather than being the end of the old, is its renewal. 

I would argue that the integration of the two systems of thought is an optimal framework, allowing the human mind to find continually fresh content, and the body to find stability in the ebb and flow of the daily routine. 

So take the nap, but set the digital alarm, and let the future come to you.

Categories
life

Try the Frivolous Google Search Game

While amusing myself by typing phrases in to Google and seeing what pops up, I discovered some intriguing results. It is a challenging time-waster to find a phrase that produces mostly content on a Google search rather than the name of a company, a movie, or a song, and diverse content at that, like blog posts. Try it – see how many phrases you can come up with that produces more than a collection of Wikipedia entries, IMDB listings, Amazon books, and other name aggregators. When you do come up with a good phrase, the results can be intriguing.

Here are some highlights …

“the art of”:

  • The Art of the Prank
    Insights, information, news and discussion about pranks, hoaxes, culture jamming and reality hacking.
    pranks.com/ – 72k –
  • The Art of Demotivation
    A text so historic deserves art of equal import. Kevin Sprouls, the celebrated creator of the Wall Street Journal Portrait Technique, lent his pen and
    www.despair.com/artofde.html – 37k –
  • How to Change the World: The Art of Schmoozing
    Schmoozing is both a skill and a fine art. Tech guru Guy Kawasaki has posted an excellent piece called The Art of Schmoozing in his blog Let the Good Times
    blog.guykawasaki.com/2006/02/the_art_of_schm.html – 137k –

“top ten”:

“how not to”:

  • Bicycle Safety: How to Not Get Hit by Cars
    Ten ways you can get hit by cars (with pictures) and meaningful ways to avoid them. Not your typical lame Bike Safety page.
    bicyclesafe.com/ – 72k –
  • How Not To Get Laid
    How Not To Get Laid – How Not To Get Laid, A Compendium of Coitus Rejectus.
    www.hownottogetlaid.com/ – 54k –
  • How to Not Be Annoying – wikiHow
    If you laugh loudly at everyone’s jokes, even if they’re not all that funny, read up on how to avoid laughing at inappropriate times.
    www.wikihow.com/Not-Be-Annoying – 36k –

PS I also found out that there are weird HTML tags embedded in the code of Google search results – they make it look pretty on the Google page but when you lift it it can be annoying.