Quantcast

How Long Will You Wait Before Buying the New iPhone? http://www.macrumors.com/iphone/

Posted via web from jessehammons’s posterous

some say “friends are the family you choose” … what are co-workers?


Posted via web from jessehammons’s posterous

this Posterous thingy is pretty cool, email posterous and it will post to twitter, FB, etc http://jessehammons.posterous.com/

Posted via email from jessehammons’s posterous

testing posterous….

this is some text in the body of the email message

Posted via email from jessehammons’s posterous

ranchtronix case

RaNChTroNiX
has the same spelling as
RANchTronix
(or maybe every1 already knew that 8-)

Kiva Donation!

We got a $92 check for having the Amazon widget in our sidebar and used it to fund four Kiva microloans. We helped fund loans to a fish seller and a jewelry artist in Nicaragua, and two farmers in Tajikistan.

kiva1

Also check out this great video that tracks the lifetime of a Kiva loan and Banker to the Poor.

Every time we get a check for having the amazon sidebar on our blog, we round it up to $100 and donate it to a worthy cause. Where should we donate next?

Nine Steps to setting up a WordPress blog

I just finished setting up the RanCH bLoG and am getting pretty good at setting up WordPress. Here are the steps I take after installing a new WordPress 2.7 blog:

  1. Enable Archival-style permalinks. In settings -> permalinks choose “Day and name”.
  2. Add a .htaccess file to make permalinks work. WordPress will try to do this for you when you enable permalinks, but might not be able to write to the root dir of your blog.
  3. Disable “Comment author must have a previously approved comment” in settings -> discussion, so you don’t have to keep watching over your comments.
  4. Enable the Akismet plugin, to block spam. You will have to create a free wordpress.com account to get an API key.
  5. Install the reCAPTCHA plugin, to block more spam. You will need to create a free recaptcha.net account to get an API key.
  6. Install a GPL-compatible theme.
  7. Add sidebar widgets in appearance -> widgets. I always add the Recent Comments, Categories, Tag Cloud, and Search widgets.
  8. Replace any boilerplate text in the theme. Hopefully this can be done by replacing the boilerplate area with a text widget, but you might have to update your theme’s php files.
  9. Update the blogroll with links to your friends.

Maybe one of these days I will follow my own advice and update this blog to a modern theme.

Announcing the Open Library Blog

Check out the new Open Library Blog! Development on openlibrary.org is happening at a fantastic pace, and hopefully the new blog will help people keep up with new features of the site.

I set up the Open Library Blog with the new WordPress 2.7 beta, which is big improvement over the older WP version that we use on TikiRobot. The OL Blog also uses a clean, widget-capable theme, and a syntax highlighter plugin that is better maintained than the one we use on TR. The visual editor in 2.7 works well, which means I don’t have to install any markup plugins. I can’t wait to update TikiRobot to modern software and get rid of the clunky CSS that we’ve inherited!

Showing Twitter Status On Your Group Blog

First a bit of meta discussion: I changed the left sidebar of TikiRobot to show the five most recent status updates from the fellow robots! It was kind of silly to display tweets from people who haven’t updated since last year. If you want your status to show up in the sidebar, and it isn’t there for some reason, lemme know!

Twitter has an API for showing for retrieving the most recent status updates from your friends, so I created a new twitter user to follow the tikirobot posters. Then, I used this python script to fetch the friends timeline and spit out html for the blog. I wanted to do this all in javascript, but the the friends timeline api needs authentication, and I didn’t want to publicize the twitter account password. Plus, this way I can cache the data on our server, so it doesn’t hit twitter so often.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/python2.5
#Copyright(c)2008 TikiRobot.net - Software license GPL version 3.
 
import time
import datetime
import os
import fcntl
import sys
import codecs
import re
 
# CalculateRelativeTime()
#_______________________________________________________________________________
def CalculateRelativeTime(str):
    dt = datetime.datetime.strptime(str, '%a %b %d %H:%M:%S +0000 %Y')
    now = datetime.datetime.utcnow()
    delta = now - dt
    secs  = delta.seconds
    if (delta.days > 0):
        return "%d days ago"%(delta.days)
    elif (secs < 60):
        return "%s seconds ago"%(int(secs))
    elif (secs < 3600):
        return "%s minutes ago"%(int(secs/60))
    else:
        return "%s hours ago"%(int(secs/3600))
 
# main()
#_______________________________________________________________________________
print """Content-type: text/javascript; charset=UTF-8\n"""
 
useCachedRss = True
cacheFile    = 'cache/twitter.json'
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
 
try:
    stats = os.stat(cacheFile)
    if (time.time() - stats.st_mtime) > 300:
        #cache expired
        useCachedRss = False
except OSError:
    #cache file not found
    useCachedRss = False
 
if useCachedRss:
    try:
        #print "reading cached json"
        fh = open(cacheFile, 'r')
        fcntl.lockf(fh, fcntl.LOCK_SH)
        contents = fh.read()
        fcntl.lockf(fh, fcntl.LOCK_UN)
        fh.close()    
    except:
        print "got some kind of error when reading cached json. quitting"
        sys.exit()
else:
    try:
        #print "fetching new json"
        import urllib2
        apiurl = 'http://twitter.com/statuses/friends_timeline.json?count=5'
        auth_handler = urllib2.HTTPBasicAuthHandler()
        auth_handler.add_password(
            realm='Twitter API', 
            uri=apiurl,
            user='username',
            passwd='password'
        )
        opener = urllib2.build_opener(auth_handler)            
        urllib2.install_opener(opener)
        urlfh = urllib2.urlopen(apiurl)
        contents = urlfh.read()
        urlfh.close()
        fh = open(cacheFile, 'w')
        fcntl.lockf(fh, fcntl.LOCK_EX)
        fh.write(contents)
        fcntl.lockf(fh, fcntl.LOCK_UN)
        fh.close()
    except:
        print "got some kind of error when fetching twitter timeline. quitting"
        sys.exit()
 
 
import json
timeline = json.read(contents)
htmlstr = ""
for i in range(5):
    name = timeline[i]['user']['screen_name']
    imgurl = re.sub(r'_normal.(jpg|png)$', r'_mini.\1', timeline[i]['user']['profile_image_url'])
    twit   = re.sub(r'\'', '&#39;', timeline[i]['text'])
    twit   = re.sub(r'\n', ' ', twit)
    twit   = re.sub(r'http://tinyurl.com/(\S+)', r'<a href="http://tinyurl.com/\1">tinyurl.com/\1</a>', twit)
    when   = CalculateRelativeTime(timeline[i]['created_at'])
    htmlstr += """<div class="twitter">"""
    htmlstr += """<img src="%s"/>"""%(imgurl)
    htmlstr += """<div class="twitterRight">"""
    htmlstr += """<a href="http://twitter.com/%s"><strong>%s</strong></a>: """%(name, name)
    htmlstr += twit
    htmlstr += """<span class="twitterMeta">- """ + when + "</span>"
    htmlstr += """</div>"""
    htmlstr += """<div class="clear"></div>"""
    htmlstr += """</div>"""
 
print """var tikiTwits = '"""+htmlstr+"';"
print """document.write(tikiTwits);"""

It’s fun to see that Twitter still uses the Javascript API that I proposed to them over the phone a couple years ago.

Also, dear lazyweb: please send my a python function that converts a UTC date string to PST. Thanks!

Injecting blogspam with Internet Hate

Several scraper sites rip off posts from tikirobot.net in order to generate AdSense revenue. Nothing new about this, and it’s never really bothered me.

But this morning, Sam and I were searching for a TR post and found that a scraper site showed up in search results ahead of TR. Obviously, something should be done. We could block the scraper, but that is Too Easy. We could redirect to goatse, but is Too Boring. We need something even more shocking.

Lulzlunch is exactly that.. a redirecting service for /b/ that allows hotlinking! We can infuse the scraper with the very worst of the Internet, and since it’s not goatse, I bet they won’t even notice.

Now we just need some RewriteEngine rules to perpetrate lulz based on referer:
[nocode]
RewriteCond %{HTTP_REFERER} http://www\.go-robots\.com/.* [NC]
RewriteRule \.(gif|jpg|jpeg|png)$ http://www.lulzlunch.com/random/b [NC,R,L]
[/nocode]

You can test it out by going here. Hit shift-refresh to clear your cache. You should get a new random (probably horrible) image from /b/ on every refresh! Lemme know if it breaks something on TR.

Snap Preview

I just added a javascript snippet to our site that lets you hover over a link and see an image preview of the page that the link is pointing to. It was super easy to add and comes from this site – Snap Preview Anywhere.

TikiRobot! Breaks 10,000 Google Units!

To some of you this may feel like any old Wednesday-before-Thanksgiving, but here at TikiRobot! Studios we are having a wild and rampant party. Old Skool TR fans may recall that at the beginning of 2006 I reporting TikiRobot! having the remarkable attribute of a single Google Unit. (In those times they were called “Googlewacks”). You can see the evidence in the screen capture to the left. Today we have well over 10,300 Google Units and no sign of slowing down.

Even more amazing is our track record with The Pineapple Audience Model. The chart below shows that our Audience Model predicted almost exactly 100,000% growth-to-date compared with our initial launch last spring . As you can see, if our servers can continue to handle the traffic, 2007 is going to be huge. We look forward to all of you buying lipstick and diapers from our innovative and helpful advertising engine over in the sidebar.

Link to 10,300 Google Units
Link to Pinapple Audience Model Projection

Microsoft Hosting “Blue Screen of Death” Screensaver

A timely news item given that a certain someone impersonated the venerable Blue Screen Of Death for Halloween (don’t worry, I’m not posting the pictures … yet :-). Apparently you can download a BSOD screensaver from microsoft.com that not only displays the chilling blue frame, but all the info is taken from your system so that “its accuracy will fool even advanced NT developers.”

Use Bluescreen to amaze your friends and scare your enemies!

Link to The Register “Download your Blue Screen of Death – from Microsoft”

RSS is the New Email: A Polemic in ObjC




About a month ago I was going on about trying to use a newsreader to keep up with all the RSS flying around. I tried Google News Reader, hated it. I tried about 10 other RSS readers, both web based and client software (mac)… I felt like they all missed the point.

When I’m reading RSS, I actually don’t give a monkey’s tail about the RSS. RSS is stupid, unformatted, unstyled text with no soul and even less information. The way to consume RSS coming from websites is to read it in it’s richest form: from the website itself. Some client newsreaders go a short way down this path by giving you button to open the article in your web browser. But this is totally lame. I mean, a drunk dog could open up a web browser and sit there through the World Wide Wait and sift through the blink tags and advertisements and try to read the article.

I am happy to make the first public mention of TikiRobotReader, a Mac OS X application that (eventually) will handle RSS in a way that is not totally dain bramaged. TRR is Open Source, a Cocoa application, and a work in progress.

The basic idea is that for a given Article, TRR will download the link to the article’s web representation and convert it to PDF so the articles are all nice and shiny and ready for your skimming pleasure, no waiting required. Here is what I want TRR to be:

Principles of Operation

  • Simple keyboard commands everywhere. Should be operable one-handed while eating lunch.
  • RSS is disposable content. It’s not critical like most (personal) Email.
  • Read the content as presented by the website, not some random choice of Font and Color.
  • Blog posts and status messages from friends are way more important than Yahoo/CNN headlines.
  • Streamline the reading process. No nagging feelings of “should I delete this article or save it?”
  • Download and cache web pages as PDF. Zero latency when switching articles.
    • PDF loads immediately, vs 1-5 seconds for an HTML page to render
    • PDF is a static page, no blinking and bouncing flash ads and animated GIFs
  • RSS is a source of content. Provide easy hooks for the sinks: Sharing and Research.

The current release is ugly as hell, but functional. At this point TRR is best enjoyed by running out of XCode so you can debug crashes and implement nifty features. I will be using it as my daily news reader in this fashion. But the nightly builds are functional and get the idea across. Feel free to contribute! Design ideas are helpful and code contributions are always a good thing. TikiRobotReader is meant to present RSS the way you, the discerning TikiRobot! blog reader, think is best. TRR will be a great place to implement all those Web 2.0/client features we want but can’t get anywhere else.

Link to TikiRobotReader nightly build
Link to TikiRobotReader SourceForge page

TikiRobot Search

google_coop_sm.gif Google just launched a neat service called Google Co-op that lets you create a customized search engine for a single (or a couple sites) so I created one for TikiRobot and put it in our sidebar (it’s all the way at the bottom). There are some other revenue sharing and customization aspects associated with the service that I haven’t really explored yet, but there’s more info here. In the meantime, you can now find that long-lost-post that you’re pretty sure you saw on this site, but don’t remember what we tagged it (cause even i don’t remember what I tag things).

The Ties That Bind Us

Friends


… I love how the word “friend” has been hijacked by web20. As in lists of things like “what your friends are doing.” I mean, on twitter I have two friends. I have two friends on a lot of websites actually, livejournal, hi5, flickr, tons of them. I can’t even remember them all. All these random websites that support the “friends” feature. There seems to be no remorse for the fact that only a fraction of my friends can even use a social networking website, much less whichever one is trendy and featureful at the moment. So as much as I want to have twitter updates from my mom and my ex-girlfriend, it’s just not going to happen.

Everything is so disconnected for no good reason. Hello google, you stitched together web1.0 into a useful mesh, why can’t you do that for web20 instead of messing around with youtube? I know there are efforts like “open friend network” or whatever but it’s just not working.

I guess that’s just the way it is, social networking websites model existing social networks. Some people are in, and some people are out. The one thing that ties my social network together is me: my cell phone, my email, my user id and password on 50 freaking websites, my day-to-day real life interactions with other people. We all implicitly manage our network using the most appropriate medium. Some of my friends *only* call me, even when email makes more sense (annoying!). Some people I interact with almost 100% on iChat, to the extent that phone calls now would feel out of place. It’s like there is a law of gravity for relationships, a type of energy minimization: use the simplest and cheapest form of communication technology available that gets the job done. The funny part is that we get annoyed if someone uses too rich of a form. For example if an acquaintance showed up at your doorstep to hand you a URL on a piece of paper. You would be like … why is this person being such a dork? Don’t they get it?

Googlewacked!

You may be be familiar with the concept of GoogleWhacking, wherein a punter enters two search terms into Google and obtains just a single result. This is more challenging that it might sound.

Even more challenging is to receive a single search result for just one search term, a feat so difficult it doesn’t even have a name. For a limited time though, you can feel that “SingleWhack” rush by entering in none other than our own official search term: TikiRobot!

Enjoy it while this while it lasts folks…we will soon have many billions of links as our readership continues to double.