Tuesday, August 23, 2005

Interestingness

endless
endless,
originally uploaded by antimethod.
Flickr.com has a new feature called "interestingness" that helps you find pictures that knock you for a loop. Since it is a huge social site, they can see who's looking at what and how they got there. They can analyze who's commenting on a picture, what strange combinations of tags are on it, etc. And then they generate from this data a page full of pictures that you have just GOTTA see.

Along the way, it wouldn't hurt you to join. Maybe you are interesting?

Monday, August 22, 2005

Chip Needs Help!

I just contributed $30 to the Chip Salzburg Legal Defense Fund by visiting http://www.geeksunite.net/ .  
Even if you don’t do much with computers, just know that this geek made your life easier without you knowing it.  He’s a little guy who tried to do the right thing and is getting stepped on by his employer.  They took his stuff and they are keeping it.  He needs help from us.

I hope you take a look at the site that tells his story.

Wednesday, August 17, 2005

Jobs Jobs Jobs

If you’d like to work in NYC my man Dan has some opportunities available to you.
If you are know Unix, Perl, Sql, C/C++ and java, give me a ping.  It would be high paying and they would pay for relocation.

If you know your way around a desktop, there’s also a desktop support position available.

Stranger Things Happen to Creative Commons texts

I’ve made a conversion for “Stranger Things Happen”, a book of short stories by Kelly Link.  It’s very dreamlike, sort of like Gabriel Garcia Marquez.  I mailed it to the folks over there and hopefully they’ll put it up for you to download.  

Tuesday, August 16, 2005

Am I old enough to watch "RAY"?

My partner Sam and I were trying to watch Ray on my ps2 last night, but somehow a parental control was set on it that prevented us from watching the dvd.  Now, it lets you temporarily raise the level by entering a passcode, but I don’t know what the passcode is.

No net access at our place right now, so I called up my man Chris A and he googled the problem for me.  As I suspected, there is a backdoor for forgetful parents and secondhand purchasers.  Hitting select and 7444 lets you delete the passcode.  

Any kid with access to the net can find this.  So you can either keep your kid away from the web, keep your kid away from the web without parental supervision, or keep your kid from the set without parental supervision.  
You can’t rely on technology to do the parenting for you.  This is not going to change.  Any company would be foolish to not build in a backdoor for their customers.  And once it is in there, the word will get out.   It’s the same problem that all digital rights management has:  where do you keep the secret so that the system is usable and valuable?  I cannot emphasize how much you should follow that link.

And what do you do when entities don’t comply with your secret scheme?  Porn dvds don’t trigger the lock because porn publishers have little incentive to trigger parental controls.  They are too small and they are too cheap to invest in enabling parental controls.  It doesn’t make them any money or save them any.  

Nothing substitutes for being involved with your kids.  And nothing substitutes for delivering value to your customers.

Blog from WORD

Looks like Blogger, current host of this humble blog, has released a plugin for Microsoft Word that lets you post and edit straight from the application!  Nice!  No more trying to compose in the tiny blogger text window.  
This is some very nice integration and it’s really the kind of synergy that open api’s allow.  Word is a very nice application for writing in, and why shouldn’t you be using something made for writing?  I like the idea that I might write a post in Word and publish it from there, then post to my blog, someone subscribes from the feed and they may read it in their email client or some feed reader.  All of this with no webbrowser involved.  This is what’s nice about the future today.

Monday, August 08, 2005

BookBorough - NYC book script

I assume you've already installed greasemonkey, right? It's only the most awesome extension ever for firefox - you do have that, right?

Good.

Check out my little script that does price comparison for you any time you are looking at a book online. Well, most times.

Tuesday, July 19, 2005

Colatown still hot in the future

Interesting - I'm reading Charlie Stross's awesome novel "Accellerando". It's a great read - fast paced, full of amazing ideas and new technology. It is so full of ideas that there is a whole wiki article emerging about it as a study guide. And, even cooler, Charlie saves us a trip to the library by providing the book for free as a download on it's website. Yup, you can buy it or you can get it for free.

So anyway, I'm reading away when this line jumps out at me:

Rome is hotter than downtown Columbia, South Carolina, over Thanksgiving weekend
- that means Rome is very hot. In the summer, there is nothing between Columbia and hell but a screen door.

Monday, July 11, 2005

New Delicious features

I'm mad for del.icio.us - I keep all of my bookmarks there and use it to discover new cool stuff all the time. It's how I discovered that little bitty browser in the post below.

Browsing the new blog for the site, I discovered two cool new features.
First, you can now bookmark sites and add a tag for:username. That user will see links for them in their "for" section. This is a great cool way to bookmark stuff for yourself and then make sure that pals get a chance to see it as well. Feel free to bookmark any good stuff for me with the tag "for:snarkhunt" It does raise the issue of spam, as now a spammer could simply script up something that spiders through the site, grabs usernames, then spams with for: tags. Presumably, their could be some sort of whuffie based response. Personally, I like using delicious as a pull based discovery device. I subscribe to where I find the good stuff I like.

The other feature I just noticed is the new posting scheme. This makes it easy for blogs and the like to make it easier for you to bookmark. I just changed my blogger template to put a little post to delicious link on every post in the footer. If you've got a delicious account, you should give it a click.

If you don't have a delicious account you should probably look into it. Delicious is wonderfully useful without an account, but even more useful when you are using it instead of just searching it.

For example, here's my inbox of links:





Anything tagged with any of those tags on the right that I am interested in shows up right there for me.
Think what subjects you'd be interested in seeing links for...

Bitty Browser

I'm playing around with this bitty browser thing.

Will this thing work? It should be a browse of my delicious links.


Wednesday, May 25, 2005

Atlanta Grad Party pics

Looks like pics are up of Jonad's Grad party.

It was a fab time.
http://www.crickie.com/modules.php?op=modload&name=News&file=article&sid=323&mode=thread&order=0&thold=0

Good luck jonboy!

Tuesday, May 24, 2005

Playlist copier

I have a pocket pc that I use to listen to music. I like to change up what i'm listening to while I'm using PocketMusic - which is excellent.
So I wrote a little app to take whatever playlists I've created on my computer and copy them over to my sd card for use on the go.
Things that I will do if I figure it out - try to go around having to take sd card out and use usb writer . see if there is someway to just go through active sync.

Since I didn't see this trivial app out there - I created it.
Here you go.
Gpl License please. If you make something better from this, please let me know and please give it away.
Following is the contents of mainwindow.cs


using System;
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;

namespace PlaylistCopier
{
///
/// Summary description for playlistcopier
///

public class MainWindow : Form
{
private TextBox txtPlaylistPath;
private Button btnOpen;
private GroupBox grpPlaylist;
private GroupBox grpSaveTo;
private TextBox txtSavePath;
private Button btnSavePath;
private Button btnCopy;
private StatusBar sb;
private OpenFileDialog ofd;
private SaveFileDialog sfd;
private ProgressBar progressBar;
///
/// Required designer variable.
///

private Container components = null;

public MainWindow()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

///
/// Clean up any resources being used.
///

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///

private void InitializeComponent()
{
this.txtPlaylistPath = new System.Windows.Forms.TextBox();
this.ofd = new System.Windows.Forms.OpenFileDialog();
this.sfd = new System.Windows.Forms.SaveFileDialog();
this.btnOpen = new System.Windows.Forms.Button();
this.grpPlaylist = new System.Windows.Forms.GroupBox();
this.grpSaveTo = new System.Windows.Forms.GroupBox();
this.txtSavePath = new System.Windows.Forms.TextBox();
this.btnSavePath = new System.Windows.Forms.Button();
this.btnCopy = new System.Windows.Forms.Button();
this.sb = new System.Windows.Forms.StatusBar();
this.progressBar = new System.Windows.Forms.ProgressBar();
this.grpPlaylist.SuspendLayout();
this.grpSaveTo.SuspendLayout();
this.SuspendLayout();
//
// txtPlaylistPath
//
this.txtPlaylistPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPlaylistPath.Location = new System.Drawing.Point(8, 24);
this.txtPlaylistPath.Name = "txtPlaylistPath";
this.txtPlaylistPath.Size = new System.Drawing.Size(352, 20);
this.txtPlaylistPath.TabIndex = 1;
this.txtPlaylistPath.Text = "";
//
// btnOpen
//
this.btnOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnOpen.Location = new System.Drawing.Point(368, 24);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(24, 24);
this.btnOpen.TabIndex = 2;
this.btnOpen.Text = "...";
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// grpPlaylist
//
this.grpPlaylist.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpPlaylist.Controls.Add(this.txtPlaylistPath);
this.grpPlaylist.Controls.Add(this.btnOpen);
this.grpPlaylist.Location = new System.Drawing.Point(16, 24);
this.grpPlaylist.Name = "grpPlaylist";
this.grpPlaylist.Size = new System.Drawing.Size(400, 56);
this.grpPlaylist.TabIndex = 3;
this.grpPlaylist.TabStop = false;
this.grpPlaylist.Text = "Find Playlist";
//
// grpSaveTo
//
this.grpSaveTo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpSaveTo.Controls.Add(this.txtSavePath);
this.grpSaveTo.Controls.Add(this.btnSavePath);
this.grpSaveTo.Location = new System.Drawing.Point(16, 88);
this.grpSaveTo.Name = "grpSaveTo";
this.grpSaveTo.Size = new System.Drawing.Size(400, 56);
this.grpSaveTo.TabIndex = 4;
this.grpSaveTo.TabStop = false;
this.grpSaveTo.Text = "Copy To";
//
// txtSavePath
//
this.txtSavePath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtSavePath.Location = new System.Drawing.Point(8, 24);
this.txtSavePath.Name = "txtSavePath";
this.txtSavePath.Size = new System.Drawing.Size(352, 20);
this.txtSavePath.TabIndex = 1;
this.txtSavePath.Text = "";
//
// btnSavePath
//
this.btnSavePath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSavePath.Location = new System.Drawing.Point(368, 24);
this.btnSavePath.Name = "btnSavePath";
this.btnSavePath.Size = new System.Drawing.Size(24, 24);
this.btnSavePath.TabIndex = 2;
this.btnSavePath.Text = "...";
this.btnSavePath.Click += new System.EventHandler(this.btnSavePath_Click);
//
// btnCopy
//
this.btnCopy.Location = new System.Drawing.Point(16, 160);
this.btnCopy.Name = "btnCopy";
this.btnCopy.Size = new System.Drawing.Size(40, 23);
this.btnCopy.TabIndex = 5;
this.btnCopy.Text = "Copy";
this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click);
//
// sb
//
this.sb.Location = new System.Drawing.Point(0, 199);
this.sb.Name = "sb";
this.sb.Size = new System.Drawing.Size(424, 22);
this.sb.TabIndex = 6;
this.sb.Text = "Ready";
//
// progressBar
//
this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.progressBar.Location = new System.Drawing.Point(64, 160);
this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(352, 23);
this.progressBar.TabIndex = 7;
//
// MainWindow
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(424, 221);
this.Controls.Add(this.progressBar);
this.Controls.Add(this.sb);
this.Controls.Add(this.btnCopy);
this.Controls.Add(this.grpSaveTo);
this.Controls.Add(this.grpPlaylist);
this.MaximumSize = new System.Drawing.Size(960, 264);
this.MinimumSize = new System.Drawing.Size(168, 248);
this.Name = "MainWindow";
this.Text = "Playlist Copier";
this.grpPlaylist.ResumeLayout(false);
this.grpSaveTo.ResumeLayout(false);
this.ResumeLayout(false);

}
#endregion

///
/// The main entry point for the application.
///

[STAThread]
static void Main()
{
Application.Run(new MainWindow());
}

private void btnOpen_Click(object sender, EventArgs e)
{

ofd.Multiselect = false;
ofd.Filter = "M3U Files|*.m3u";
if(ofd.ShowDialog() == DialogResult.OK)
{
this.txtPlaylistPath.Text = ofd.FileName;
}
}

private void btnSavePath_Click(object sender, EventArgs e)
{


//sfd.Multiselect = false;
//sfd.Filter = "*.m3u";
sfd.DefaultExt = ".m3u";


if(sfd.ShowDialog() == DialogResult.OK)
{
this.txtSavePath.Text = sfd.FileName;
}
}

private void btnCopy_Click(object sender, EventArgs e)
{

FileInfo fi = new FileInfo(txtPlaylistPath.Text.Trim());
FileInfo fo = new FileInfo(txtSavePath.Text);
DirectoryInfo dirOut = fo.Directory;
FileInfo fcur;
TextReader tr;
if(( tr = new StreamReader(fi.OpenRead())) == null)
{
MessageBox.Show("Problem Opening " + fi.Name + "for reading.");
return;
}
//get linecount of the playlist
int i = 0;
while(tr.ReadLine() != null)
{
i++;
}
tr.Close();
progressBar.Step = 1;
progressBar.Maximum = i;
progressBar.Minimum = 0;

tr = new StreamReader(fi.OpenRead());


TextWriter tw;
if((tw= new StreamWriter( fo.OpenWrite())) == null)
{
MessageBox.Show("Problem Opening " + fo.Name + "for writing.");
return;
}



try
{
sb.Text = "Copying";
string line;
while( (line = tr.ReadLine()) != null)
{
//is this a comment line?
if (line.StartsWith("#"))
{
//It's a comment line.

//progressBar.
//write it to the new file and then keep going
tw.WriteLine(line);

//increment progress
progressBar.PerformStep();

}
else
{
//it's a file path
//find the file
fcur = new FileInfo(fi.Directory.FullName + @"\" + line);

if(fcur.Exists) //only move good files
{
//only move files that don't already exist
FileInfo ftest = new FileInfo(dirOut.FullName + @"\" + line);
if(!ftest.Exists)
{
//copy it to the new file directory
DirectoryInfo dirnew = new DirectoryInfo(dirOut.FullName + @"\" + Path.GetDirectoryName(line));
if(!dirnew.Exists)
{
//Parent directory of new file doesn't exist yet


// need to create the parent dir for the file.
dirnew = dirOut.CreateSubdirectory(Path.GetDirectoryName(line));
if(! dirnew.Exists)
{
MessageBox.Show(@"Can't create "+ dirnew.FullName);
return;
}


fcur.CopyTo(dirOut.FullName + @"\"+ line);
}
}
//write the entry to the new playlist
tw.WriteLine(line);
//increment progress
progressBar.PerformStep();
}

}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace);
}
finally
{

tr.Close();
tw.Close();
progressBar.Value = 0;
sb.Text = "Ready";
}



}


}

//TODO: separate out the concept of a playlist into an interface


}

Friday, May 20, 2005

Responses to This Mobile Life greasemonkey script

I'm reading the comments and am trying to respond to them in an organized way.

* You are a jerk for revealing the cool secret I discovered! Now they will ruin it for EVERYBODY!
** Sorry. I think they give this stuff away. It's their servers. If they want to, they have that right. Let's give them a chance to be awesome instead of expecting them to be jerks. Take some comfort in the fact that if the links get obfuscated it will affect me (sob), just as it will when someone else beats the obfuscation (yay).
** Tell all your friends you were doing it way back when. Show them file creation dates to prove it. They'll be totally wowed. Don't mention how you didn't share the idea with your community.

* You are a jerk for stealing from public radio.
** It's public radio. They give this away over the airwaves. They give it away over the internet. They want you to listen to it. Feel free to donate directly to the station or to NPR in general. I hope more people listen to this stuff and give them money, but not so much that they can retire in luxury from their job of making cool stuff for me to listen to.


* You are a jerk for using up all the bandwidth of WBEZ.org
** Actually, I only created this script after reading Mark's review of the RadioShark in the last issue of Make. I told him about the trick and told him I'd try to whip up a greasemonkey for it. I then gave him a link to the script and he blogged it on boingboing. So he's a awful nasty man for telling all of you about it. Pledge that you'll never read his awful nasty blog again for what they did to wbez's servers.
** I have also taken a suggestion from the comments and put in the coral cache address. That's so hot, I love it. Wish I'd thought of it in the beginning.
** Turn: I'm saving them bandwidth. If you listen to the same stream twice you download it twice. If you download it once each subsequent listen is FREE to wbez.

* You are a jerk for your crappy blog design.
** I apologize. It's definitely not ready for prime time - but I think it is just the pre tag blogger put in when I pasted the greasemonkey script in. In my defence I think any long line in this particular template with that tag will overlap the sidepanel. Can't be helped unless I take down my flickr panel. That ain't happening.

* Thanks!
** You're welcome! It feels good to be able to give even something tiny back to the internerds who've given me tons of cool stuff. Gift economies rock. Now go do wonderful things.

BTW - this website is no longer active, so you can take the domain name!

Thursday, May 19, 2005

How to be good with your money

Not only can you use the modest "Modest Needs" box on the sidebar, but you can also support my two pals in their run against leukemia and lymphoma. Leukemia is represented by Jess. Lymphoma is represented by Leigh. They are both fine people doing a fine thing.
And by fine I mean fine.

This American Life downloads

I love greasemonkey. It's sort of a uber extension for firefox that lets you have hacky control over how pages display and what they do. The scripts for it are amazing.

So I wrote one.
This American Life is a radio show about everything and it is really smart and awesome - if you haven't listened to it you totally should.

Number 61 called "Fiasco" is my favorite.

They have a links to buy cd's from audible.com and they have links to realaudio streams that are free.
Unforunately, I like to listen to them on my pocket pc.
Here's a greasemonkey script that changes all the stream links to download links.
Install greasemonkey.
I don't have separate hosting, so just copy and paste this into a file and open it in firefox.
Then go to tools, and install user script.
Open thislife.org - all ram links should point to the actual .rm files now for downloading.

Please feel free to improve on this. It might be nice if it offered you a separate link for downloading as opposed to streaming.

Why doesn't it work?!
Thanks for your input! Please let me know how it isn't working.

I am in the main page, none of the sub pages have the links converted.
You've got an old version! The new version works better better, sometimes. Thanks much to
Why is thislife.org CRAWLING right now?
I had no idea so many people would use the script and the first version hit their servers directly.
I'm putting up a new version that hits the coral cache of it. Thanks Jaime Alesso!


If you know how to fix this, let me know, I'm looking at it.
Please email me if you can host the script, thanks.
update: fixed to work with firefox 1.5/greasemonkey 0.64

from here

// This Mobile life
// version 0.4 BETA!
// 2005-05-19
// Copyright (c) 2005, Matt Katz
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "This Mobile Life", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name This Mobile Life
// @namespace http://snarkhunt.blogspot.com
// @description Changes all This American Life ra stream links to link to the .rm file to download
// @include http://thislife.org/*
// @include http://*.thislife.org/*
// ==/UserScript==




var allLinks = unsafeWindow.document.getElementsByTagName("a");

for (i = 0; i < allLinks.length; i++)
{

var href = allLinks[i].href;
if (href.match(/ra\/([0-9]+).ram$/i) )
{

// alert('Hello world!');
var episode = href.match(/([0-9]+)/i);

//get the number to get the episode number
if(episode){
allLinks[i].setAttribute("href", "http://wbez.org.nyud.net:8090/ta/" + episode[1] + ".rm");
}


}
}

Thursday, April 14, 2005

Newest Flickr Friend

Sillyness
Sillyness,
originally uploaded by smumfa.
Finally Sam's gotten in on the action!

Tuesday, April 12, 2005

Our first rasterbation

Our first rasterbation
Our first rasterbation,
originally uploaded by snarkhunt.
I found the rasterbator on lifehacker. When I looked at the gallery I had nearly wet myself. I sense this will be a continuing part of my life...

Friday, April 08, 2005

Dirt Cheap Macros

I've been using slickrun to automate getting to some programs and folders. It's handy and it has autocomplete.
Adam at work showed me a cheap way to get similar functionality.

  1. Create a folder for shortcuts - I used c:\cuts
  2. Right click on My Computer and choose properties.
  3. Click the advanced tab.
  4. Click on Environment Variables.
  5. Under system variables, scroll down to one labeled "Path".
  6. Edit it and add a semicolon after the last variable and add in your shortcut folder path.
  7. Create a shortcut for any program you want to be able to get to quickly and put it in there. Try giving it a short 2 or 3 letter name.

Now you can run any shortcut you drag there by just typing windows-r and typing in the name. After the first time you run it, the run box will autocomplete.

Perhaps you could make put your desktop in your path... Then as programs install, they will add a shortcut automatically for you. Perhaps you could put your quicklaunch folder in.

Friday, April 01, 2005

Went to copynight

Copynight is a calendar of copyright related events. I went to the inaugural event at the horrible Bar 9 and had a good discussion with Peter Tolmach of WellGoodLLC. He's working on a very interesting charity website that hopefully I can help betatest.

Also met Esthr who is definitely the most Flickr enthused person I've ever met.

Wednesday, January 12, 2005

Nethack

The best game ever apparently has a version for pocketpc - I'm so psyched. More carnage and things to do than GTA ever dreamed of.