Interestingness
Along the way, it wouldn't hurt you to join. Maybe you are interesting?
Posted by
mlk
at
9:04 AM
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.
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.
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.
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.
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.
Posted by
mlk
at
8:07 PM
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.
Posted by
mlk
at
8:39 PM
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.
Posted by
mlk
at
4:04 PM
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...
Posted by
mlk
at
7:49 PM
I'm playing around with this bitty browser thing.
Will this thing work? It should be a browse of my delicious links.
Posted by
mlk
at
7:06 PM
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!
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
}
Posted by
mlk
at
10:12 PM
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!
Posted by
mlk
at
7:31 PM
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.
Posted by
mlk
at
8:57 PM
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 Rhett Sutphin for this!
Basically, it's having trouble with the frames - on the page rightclick-this frame->open in new tab. This new tab will have all the links convereted
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");
}
}
}
Posted by
mlk
at
4:41 PM
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.
Posted by
mlk
at
6:28 PM
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.
Posted by
mlk
at
9:02 AM