Learn Things
[Recent Entries][Archive][Friends][User Info]
Below are the 10 most recent journal entries recorded in the "shack_a_nerd" journal:[<< Previous 10 entries]
05:43 am
[Link] | If I told you, would it make you sad Or would you stay with the facts, Or would you hit me right back? Because you think all girls are dumb or undone Square or unfair That's what you say (Hit it) Nothing against the lame But they're the only other ones I've ever seen move that way You dance bad
Sit down, give up You suck, you dance bad --Palomar, "You Dance Bad"
These days it seems like my mood is measurable according to what I sing to myself, whether it's Palomar or A Weather or world of science. Today it's Palomar, but yesterday it was just the song of my swearing to myself loudly in English about how tired I was of everyone. I have 7 hours of class today, but yesterday class was mostly cancelled, and today it looks like most of the students are interested in starting vacation early. Can't say I blame 'em. In one class we played Twenty Questions, that ought to give you an idea of how motivated I am today. But in another class, the classroom was just totally empty.. I've been visiting this "friends" page on livejournal with some regularity. It's really a silly habit since it's usually almost empty, like everyone else is on vacation too. But I always hope Theo or Zotmeister has written something. It's weird, the kind of emptyness I find here, it's like Chiz's father said once, "Nothing is emptier than the sky where a tower used to be".
Anyhow, I guess I just wanted to stop by and say hi. I hope you're all doing well.
|
06:24 pm
[Link] |
Intermission I've heard from the gummint that I will be leaving for Cameroon on the 2nd of June. In the meantime I've been brushing up on my French and trying not to freak out.
27 months is a long time. Attempting to conceptualize how long it is or is not, I've been thinking about what's changed over the last 27 months ("beginning of 2008"). So far:
- politics: 27 months ago Bush was still in the White House, but Barack Obama had announced his candidacy. I don't think I had started paying attention yet.
- technology: 27 months ago, Ruby was still the "hotness" language to do web stuff in. I think this is still true today, although I think Django and Python are also strong contenders.
- romance: 27 months ago I was still mooning over Linda. Now I'm involved with another, much better lady.
- automotive: I don't think anything's changed here since the Prius came out (1997).
- televisions: the digital television transition hadn't happened yet (Feb-June 2009). The HD-DVD/Blu-Ray was just ending.
- cell phones: I didn't have one. Android was still the subject of much hype. iPhone was still the phone to beat. (I now have an N900.)
- Internets: I didn't have a Twitter account; only social-media "people" did. Facebook was only a small threat to privacy, rather than an impending threat.
All things considered, I am expecting a certain amount of change while I'm gone, but expect a large amount of it to be "churn", and can safely be ignored. Unless the singularity occurs, of course, in which case I guess all bets are off. I'm also formulating a list of questions I'll want to ask periodically, like in the beginning of Anathem.
Of course, if you're in the New York City area at some point before early June, I'd love to see you before I go! I should be coming back once or twice during my service; let me know if you'd like to hear about that.
Ethan
Tags: life
|
01:56 pm
[Link] |
github and "social code" I've been keeping slightly-increasing amounts of code on Github lately. It's a pretty wonderful service; lightweight hosting for lightweight open source projects. Just throw some code up there and you're done. The most interesting things I have there right now are ethan-wspace, which are customizations to whitespace handling in emacs, and phphaml, my fork of the phphaml project (which is a HAML parser for PHP; HAML is a lightweight HTML-template-y language).
Of course, the real magic of github is when you fork a project. A couple of PHP programmers have done so with my phphaml repo. One of them has committed twice to their fork, once to add some "ignored" files, and once to make a change that has no effect. The other person has committed three times, breaking the unit tests and departing from HAML syntax. I would never pull from either of these forks, much the same way as I would never be friends with these people. So I guess my opinion is that this experiment is a success; we've discovered that PHP programmers are universally idiots, and PHP programmers have learned a little bit of how to use Git.
Ethan
Tags: hacking, life
|
11:09 am
[Link] |
emacslisp Spent three or four hours last night sinking into emacs lisp, trying to get the hang of font-lock-add-keywords so I could highlight certain things. There are a few places where it's clear that elisp was evolved rather than designed. As a result, I've gotten some real insight into what makes a horrible API. For some perspective, check out FontLockKeywords on the EmacsWiki.
There are some things everybody knows about bad APIs: a constructor should define an object in a sane state, Don't Repeat Yourself, etc. But there's a wealth of APIs that are horrible in emacs for less-well-known reasons. For example, emacs has text properties, overlays, and faces, which are all distinct, sort of related, and subtly different. In order to know which of these things you want to use and how to use them, you really have to know about all three.
Similarly, the font-lock-add-keywords thing: if your added keyword is of the form (REGEXP . FOO), it specifies a face, but if you use (REGEXP FOO), it specifies a function (?) and your fontification will simply not work. If you have two different uses, they should be more different. This is like the opposite of the point above. Similar things should look similar, different things should look different, and (like the Zen of Python states) "There should be one-- and preferably only one --obvious way to do it". In org-mode, for example, there are categories, tags, priority cookies, and TODO states, and figuring out what to use each for is the steepest part of the learning curve.
Debuggability is also extremely important in an API. Failing early is a good plan when you can -- I guess you can't, here, because you want to allow things to be defined in any order -- but failing explicitly is much better than shrugging and carrying on as best you can. Like the Zen of Python states, "Errors should never pass silently./ Unless explicitly silenced."
Elisp is a "LISP-2" with a separate namespace for functions and variables, which I find annoying, but in fact they take it much further -- there is a separate namespace for faces, for example, and no way (that I could find) to "unbind" a face. This means if you screwed up your defface call and want to try again, you're basically screwed; restart emacs. This means your workflow is going to be, "Keep one emacs open to play with code, and another emacs to run it and see what happened." (However, there are functions, makunbound and fmakunbound, to unbind variables and functions, respectively.) I feel like there's a principle hidden here too -- every time you define a new system, there's a temptation to define the most important parts of the system first, but it's the last 10% that really makes it useful. For example, if you think of a web browser as the new operating system, there's no concept of a machine image, so you can't have multiple states at once (different machine instances), move state from one computer to another, etc. But maybe I'm full of crap.
Ethan
Tags: hacking, life
|
11:45 pm
[Link] |
Mature wisdom I have been thinking lately about this quote of Robert Heinlein's:
It's amazing how much "mature wisdom" resembles being too tired.
This aphorism is so fascinating because it surprised me. When I was younger, I used to think it was just a comment on how "zen", surreal, counterintuitive, or self-contradictory such wisdom could be. The words get sort of hazy when you're up too late, and you say things that don't make a lot of sense when they're viewed head-on.
But now I'm thinking there's a bonus meaning. It used to be that I didn't much care about being cold outdoors, or about skipping meals or pens leaking in my pocket or other "creature comforts", but now I care a great deal. Mom packs bags and bags of stuff for every trip, even simple doctors' outings, whereas I just bring my messenger bag. And even that is more than I used to carry -- a notepad for writing things down and a book in case I got bored.
To listen to my parents, the world is unpleasant, and you should protect yourself from as many unpleasantnesses as possible. And my stance, that there are some cures that are worse than the disease, is really just a matter of degree. After all, I bring my camera everywhere, just in case I see something ephemeral. I bring my earplugs, just in case I'm at a loud concert. Each of these things burned me one too many times and I decided it was worth the extra weight to not have to face those problems again.
It's like the underlying effect is increasingly defensive. In order to avoid unpleasantness, you prepare for the worst. In other words, you're too tired to suffer any more than you have to, even at the cost of suffering a little bit all the time.
It used to be that I would daydream about unlikely circumstances; now I try to mitigate them. I got old somehow, when I wasn't looking. Before long I'll start carrying an umbrella and wearing hats and you won't even recognize me.
I'm going to Pycon this weekend. I just packed half a suitcase and half a backpack with more clothes than I'll really need. I don't remember if anyone reading this is in Atlanta, but if you are, feel free to let me know.
Ethan
Tags: life, writing
|
09:45 pm
[Link] |
HipHop: who cares?
To borrow a phrase from our wise elders, "There's a lot of people flailing around and growling like epileptic bulldogs over this new [Facebook thing]. I guess this is just because [PHP developers] are intrinsically retarded." Frankly, I don't get the buzz at all, on any level. Here's how I see it. Fact: PHP is a terrible language viewed from any angle. After a year of JavaScript, I feel completely qualified to make this claim. In other words, I know a thing or two about terrible languages, and PHP is much, much worse than JS. It's important to state this upfront. The language is bizarre, the standard library is completely inconsistent, the community is terrible, and in general you can tell very easily that PHP is a template language that grew out of hand. On top of that, it's an evolutionary dead-end. Simple example: how many programming languages do you know of that are case-insensitive? Well, count PHP among them. Really! Both class names and variable names! Bonus example: Can you tell me what the difference is between the following PHP expressions? They're all allowed according to the syntax. - foo::bar
- foo::bar()
- foo::$bar
- foo::$bar()
- $foo::bar
- $foo::bar()
- $foo::$bar
- $foo::$bar()
- $foo->bar
- $foo->bar()
- $foo->$bar
- $foo->$bar()
- foo\bar // yes, really; N.B. this only becomes allowed in PHP 5.3
In short, if your application is written in PHP, you have bigger problems. Which raises the larger question: why the fuck is Facebook written in PHP? Surely they know better by now. Fact: PHP isn't blazing fast to begin with. The programming language shootout shows PHP is approximately 1-3 times slower than Python in most benchmarks. A factor of 2 performance gains given that context are not impressive. Fact: Facebook is not a company known for its open source efforts. Not to say they haven't tried. Their platform fbOpen was released couple years ago but largely nobody cares. Their NoSQL database, Cassandra, has been out for a while, and has been gaining traction now that some guys from Digg basically spent six months patching it. Interestingly, Facebook has forked Cassandra and has been developing their own version ever since. Fact: the technique is not new. Even at 10gen we were compiling JS to Java to get speed. Compiling a higher-level language (I use the term loosely) to a lower-level one is a well-known technique for improving performance. The Python interpreter "Jython" even uses this as its main implementation strategy, directly emitting Java bytecode and then executing that. Even emacslisp has its own bytecode format, meant to make execution faster. What's the big deal? Taken together, what are you left with? An uninteresting, unreliable and pointless attempt to make a dying language faster. And yet, it really isn't a joke to say, as Marco Tabini did, that you'd have to be living under a pretty big rock to have not heard about this. The energy around this announcement is enormous. So why all the fuss? Color me confused. Ethan
Tags: rant, technical, writing
|
11:28 pm
[Link] |
CouchDB Today I spent some time playing with CouchDB. It's really sexy stuff -- exciting and fresh. In many ways it's exactly what I wanted to find when I was looking for a backend. I was going to keep going, look at Redis and other associated projects, but I am currently so in love with CouchDB that I have a hard time envisioning myself switching to a key-value store -- I'd end up writing re-implementations of all the nice CouchDB features.
Map-reduce as a form of "query" is a little challenging to get used to. It's not really like a query -- it's more like an index, which is built incrementally over documents as they are added or changed. One quirky thing about the CouchDB "reduce" part is the method signature. "Traditionally" a reduce function is: function reduce(key, values) -> values; in CouchDB it's function reduce(keys, values, rereduce) -> values. This can be disorienting because after all, reduce is only called on values produced by one key -- so why are you passed multiple keys?
As far as I could tell from the CouchDB mapreduce emulator, the keys list is actually an array of [key, id-of-generating-document], and you ought to expect every key to be the same. (But be careful of the rereduce parameter, because you might not get keys at all.) In fact this is only true when you pass group=true in your query, and even then you may see in your logs that you're getting multiple keys too. My best guess is that CouchDB is also precomputing the result when group=false, and although it's distracting, it doesn't appear to be changing the results.
I've also found this post about "joins" extremely helpful in trying to understand the possible ways you can structure your data in a document-oriented DB. Still playing with that/benchmarking..
Ethan
P.S. The guys who built the CouchDB emulator also built something called pcapr. Motto: "Welcome to pcapr, where pcaps come alive." Yes, Flickr for packet dumps. Oh, Internet..
Tags: review, technical
|
10:53 pm
[Link] |
Altec Lansing VS4221 remote battery tray The remote for the Altec Lansing VS4221 speakers is hard to open up to get the battery in there. For the record, the tray comes out if you pull it hard enough (LOTS of force). The little notched thing off to the side is a spring clip which presumably helps hold it in, but I've found it's a little aggressive.. I have had better luck just yanking really hard than I have had with trying to operate the spring clip.
Ethan
Tags: hardware, review
|
10:34 pm
[Link] |
lockers retrospective
I decided I was gonna put down my Secret Project ("lockers") for a while and thought I'd be best served by writing a few words about it. Of course, you know how I am.. that translates into about 2500 words. Lockers is up right now, running on lockers.sixthfloorlabs.com, although all it is right now is a photo gallery that hasn't been updated in like four months. Origins I got the idea for lockers towards the end of 2007 when I was playing with ikiwiki. ikiwiki, for those of you who don't know, is a piece of software that translates a tree of files into HTML, thereby "compiling" a wiki from a version control system. It has some hooks to interrogate the version control system for history, and is capable of doing some querying and rendering of files as RSS feeds. The number one use case for ikiwiki seems to be documentation/bug tracking for open source software, but some nerds use it to build their own blogs. (I'm one of those; ikiwiki powers www.betacantrips.com.) You can usually identify these people by the fact that their technical writing occasionally says something like: "the gtkbuttonnew function creates a new gtk_button". This is because they are using Markdown, and.. yeah, about that. As I saw it, ikiwiki was inappropriate in a few ways and didn't go far enough in others. To wit: - ikiwiki uses Markdown by default to translate plaintext into HTML. I don't like Markdown for a lot of reasons; I prefer ReST, and ikiwiki's ReST support wasn't great, and I couldn't be bothered to fix it.
- ikiwiki was unapologetically written in Perl, which is a completely valid software choice but one I don't love (I prefer Python).
- ikiwiki's function is to translate files into HTML; it has very little support for truly dynamic functionality. You can edit files via the web, and you can write-lock files, but you can't easily read-lock files, for example. If you want to do something much more complicated, like say build a picture gallery, you're basically going to hurt a lot.
- "ikiwiki" is really hard to type in Dvorak!
Of course, these criticisms may not be valid any more. I haven't been keeping up with ikiwiki too much. But in 2007 they were enough to encourage me to start working on lockers, which I did first by exploring the performance characteristics of version control systems, with the hope of using one to power a web application in realtime. Other related work: Sputnik, which is based on Lua and Markdown. Lua stores code and data both in the database, which seems kind of crazy to me, but there you are.. Goals For a long time I've wanted to build a "home" on the Internet where I could hang out with my friends. Over the years this desire has gotten stronger when I've made use of sites like the Button Men Web Game or ktvoelker's The New Game Center. I really loved the concept of wiki when I first found out about it, but it's hard to "hang out" on a wiki -- and as a gamer, whatever site I built had to have game functionality too. If I was going to build some kind of home/site, I wanted it to be everything: wiki, photo gallery, board game place, discussion board, event planner/calendar -- essentially "home base" -- and additionally I loved the concept of wiki so much that I wanted it to be version-controlled. (I know about Google Wave. More about that later.) Development My first commit on lockers was 2008-01-13. At the time I was using hg but eventually converted to bzr. My first priority was to build a read/write lock using POSIX's fcntl. I probably "only" spent a couple days on it, but it already goes to illustrate a few points about my development style: - I seized on a fairly minor aspect of the codebase (locking) and immediately went tumbling down the rabbit hole building the best implementation of that aspect that I could imagine. Refining that aspect somehow became a priority, when moving on (at most, stubbing it out) should have been the priority.
- Eventually this component became a liability -- after I rewrote it to get it to work (ha ha), I had problems with lock contention within the same process. When this happened, I continued to refine it beyond the point of diminishing returns. It turns out that by the time lockers went in to production, no locking was necessary because only one thread ever actually did any writing.
I got the first 0.1 release of lockers running in April 2009, a year and a half later. It supported user logins, but not user registration; photo uploads; and some primitive historical querying. The picture module -- the only thing that even approached finished -- does not support multiple users; it only looks at one hard-coded user's pictures. Nevertheless I successfully uploaded a few gigabytes of pictures. But, appalled at the site's speed and deplorable code quality, I decided I would spend some time refactoring it. It's been six or seven months. I just realized I've gone down another rabbit hole, and the functions lockers was designed to have aren't really that important anyhow, so I think I'm going to stop working on it for a while. Design Migrations I designed lockers with the assumption that data in the version control system was going to be immutable forever. This meant I'd need a system to cope with old data -- a migrations system to turn it into "new" data. To cope with this, I built a system where each class had multiple versions, and inheriting from classes was a "magical" operation that could perform a cartesian product of classes. In short, if I had a FooObject class with versions 1, 2, and 3, and I created a BarObject which inherited from FooObject, I'd get a BarObject version that subclassed FooObject 1, another one that subclassed FooObject 2, and a third that subclassed FooObject 3. It turns out that this is a solution in search of a problem. Not only that, but it's the thorniest part of the codebase -- something like 20% of the lockers code performs this duty. It's much cleaner code than it was six or seven months ago, but it's still incomplete and pretty disorganized. Refactoring it was a good exercise, but better would have been to just tear it out. With the benefit of hindsight, I can be completely confident when I say that. I've actually had to run migrations over the data in the version control system at least twice, and it sucks, but it would have sucked less if I hadn't also built and maintained the code that I wrote so I wouldn't have to. The lesson here is, "You're gonna have to change your data; get used to it." Immutability isn't necessarily a great thing for data. You're much better off running a migration once and forgetting about it than maintaining a huge lattice of class versions the way I designed. VCS as DB I used git as my backend, with a thin layer to abstract the kinds of queries I was going to need the backend to support. I like to think about what I did as replacing a relational database with a "path-based historical database" or some other gibberish. There were some good reasons for this and some bad ones. I'm still not sure whether I made the right decision here. Basically: - Doing a fork-exec to git in order to get a piece of information is still pretty slow -- 0.1 seconds. I think part of this is just the cost of doing a fork-exec (you can't embed git in any feasible way). git is the fastest version control system I found, but I still wonder if it might have been faster to talk to a dedicated database. I ended up building my own indexes anyhow, so why not? This would have required more up-front work to map the kinds of things I was thinking about (objects, revisions, child objects, parts of objects) into key-value stores or whatever, but probably would have bought me performance.
- Scaffolding. git provided me with a certain amount of convenient functionality at first that I didn't have to reimplement, although eventually I did reimplement some of it. Being able to use git log commands on the command line to see what was getting stored, or even just being able to walk the directory tree myself and cat/less files was pretty convenient. I would have had to learn a new interface to verify lockers's operation if I had been using a different backend.
- Distributed? Something like ikiwiki benefits greatly from being stored in a distributed version control system, because you're basically editing text files, you can build a wiki out of a source tree, you get disconnected operation, etc. But for a web programming framework, distributedness means nothing. I did want to figure out a way to let a user operate offline, fork the database, etc., but you can't have read locking as well as cloning. (At least, I was too dumb to think of a way. I guess you could do it in theory using PKI.) Besides, once you upgrade the second gigabyte of pictures, cloning seems a lot less feasible..
- Binary blobs like pictures really don't belong in the same database as your essentially plaintext data. There's lots of ways I could have done this differently, even including just getting a freakin' Flickr account. NIH reigns supreme..
Overall I think I might have been better served using a NoSQL database -- or even hand-building a version-control-ish system in MySQL like MediaWiki does. I could have pled ignorance when I started, but I worked at 10gen for a year and I never switched to Mongo or anything else. Analysis The larger question of whether it's important to maintain history for "everyday" actions like chatting, planning events, etc. needs to be addressed or else lockers is still just a solution in search of a problem. Over the last couple of years I've come to the conclusion that this kind of history is not important. Two things, in particular, hammered this home for me: - I've lately started going through lots of old files I've had lying around on my computer. I have megabytes and megabytes of old chat logs, classwork, dot-rc files, etc., not all of which are completely well-organized. I've been trying to sort everything out and cull the crap I don't really need. It turns out that the vast majority of the files I come across are pretty much worthless, even to me. It makes it hard to form a compelling argument for archiving this stuff; if I can't care about it, why will anyone else?
- Google Wave is the obvious comparison when you talk about things like social networks, wikis, and conversations. It's an interesting project, but watching it get used, I'm even less convinced of the utility of accessing history. Nobody does it. So far it's too clunky to use, and the concepts are still a little alien, but even when those things are addressed, the history of a given interaction is usually obvious just by looking at it. After all, if something changes, people usually make that clear using in-band data: "NOTE: Time changed! I have a doctor's appointment that morning," etc.
My other goal -- building a place to hang out online -- seems to have been obviated also; most of the people I care about "hang out" on Twitter (on which I have an account; identi.ca too). And if I want to play games online with my friends, I'd be better served by loading up BSW. With all of these considerations, and considering the fact that hacking on lockers just hasn't been fun the last few months, I'm putting it down for a while. Lessons learned? - I really really suck at coding "in the large". I can knock out 500-1000 line hacks -- even well-engineered, user-friendly ones -- in a couple of weekends, but there seems to be some kind of limit -- 7500 lines, or 18 months -- after which I just don't cope very well. I don't really know why this is, if it's something I can get over with practice, or what. It's a little depressing. This isn't the first project I've abandoned, and I'm sure it won't be the last. Historically speaking, I'm afraid I'm just very very bad at following through. Sorry.
- I still haven't learned how to find out the needs of users and build from that. I don't think I'm about to learn, either; I'm still interested in making things "for me".
- I need to cut my losses earlier -- both in terms of stopping work on an unimportant component, and dropping projects that aren't interesting.
- Not Invented Here syndrome can sometimes be good because it saves you from going off into the weeds trying to adapt yourself to something that doesn't fit, but it also can be bad because it encourages you to go off into the weeds to build something that still won't be exactly what you want.
- Worse is Better. Actually, Worse is Much, Much, Better. Also: Bad is Good, Baby, Down with Government.
I don't yet know what I'm going to work on next, or indeed if I'm going to work on anything next. I haven't really had time to hack much lately -- between work, reality, my family, and trying to hang out with my friends once in a while, I haven't really had the time to do everything I wanted. It seems like organization helps you make time, but perhaps at the cost of robbing your life of every joy. I will say this: my current life goal is to do something notable. Secret projects seem the best way to go about doing that, if you find the right secret project. Ethan
Tags: hacking, writing
|
08:48 pm
[Link] |
Recycling electronics In the spirit of "a paper is a progress report, not a finished story", here's my incomplete efforts at recycling electronics and broken nerd toys in NYC. The relevant objects were:- circuit boards --expansion cards, motherboards
- a few old CD-ROM drives
- hard drives
- an old CRT monitor with "fuzzy guns"
- lots of cordless phones + base stations (N.B. not cell phones, which I'd send to Cell Phones for Soldiers)
- a cordless phone (i.e. a telephone receiver not attached to a base unit)
- an old digital camera in pretty terrible condition
- a pair of earphones
- an old pair of speakers
and other miscellaneous junk.
My procedure was to consult the Department of Sanitation's guide for recycling electronics. There I found out about the RECONNECT partnership between Goodwill and Dell. From the description I somehow got the impression that all kinds of electronic junk would be accepted -- why not, right? It's gonna get turned into raw materials anyhow. However, if you look at the full list of acceptable items, you'll see that it includes hard drives but not a lot else. Additionally, Goodwill's mission (to sell second-hand goods) confuses the issue -- if you actually go to a Goodwill location with electronic junk, they may not be willing to take it since it's "broken" or "just parts".
I ended up talking them into taking the hard drives, circuit boards, speakers and CD-ROM drives, as well as the monitor, but I think they're gonna try to resell the monitor (which frankly does a disservice to both vendor and vendee) and the circuit boards will probably end up in the garbage unless the list of acceptable items has more wiggle room than I thought. I decided to keep the digital camera, cordless phones, and other crap.
Following this rebuff, I went back to DSNY's site and followed the link to take it back nyc!, a collection of manufacturer/retailer takeback programs. Most of the crap I wanted to get rid of were not from "reputable manufacturers" (the kind who have takeback programs), so that pretty much left me with the retailer programs. Most of those were easy to rule out too:- I wasn't buying new equipment, so PC Richard and Son's program was out.
- It wasn't computers or even computer parts any more, so the Mac Support Store (N.B.: not Apple, but an Apple-certified repair shop) and Staples programs were out.
- Mostly it wasn't still working, so the TigerDirect program was out.
- I couldn't find "cordless phone" on the RadioShack or Costco "online appraisal tools", so those were out.
That left the Office Depot (N.B. not Office Max) "pay for a box of crap" program and the Best Buy "two items per day" program. I had a bag of crap, so I went to Office Depot. The basic idea here is that you buy a box for $5, $10, or $15 depending on size, and then they ship it off and recycle it. I never actually got to see the box, which they were sold out of (or something?) but they charged me $5 for half a plastic shopping bag full of crap. According to their site, there is one Office Depot location in New York City, in Times Square.
What I find annoying about all of this is how difficult it is to do the right thing. If I had my druthers, you could just throw this stuff in normal "blue-bag" (i.e. metal/glass/plastic/aluminum foil) recycling and the government would have an agreement with a recycling vendor to do-the-right-thing with the kind of crap I throw out. Instead I have to figure out what I can do with each of my individual objects, none of which are functional or salable and have negligible value as anything but scrap. And it's all the same scrap! You think there aren't circuit boards in my cordless phones? Sigh.
Next time I intend to pay closer attention to the concept of a recycling vendor. It turns out there are a couple in NYC, depending on what you want to get rid of. I bet they keep normal business hours, though, which makes it more complicated. It looks like the major player here is Gazelle, which involves shipping things and doesn't even cope with cordless (i.e. non-cell) phones. It's like the state of the art in recycling, like in electronics itself, moved on, and now you need to buy all new stuff to recycle..
Ethan
Current Music: Barcelona - Obsolete Tags: hacking, hardware, life
|
[<< Previous 10 entries] |