...And we're back, ladies and gentlemen.

Well, that sucked! Just a friendly word of advice, if you're going to register your domain with "Network Solutions":http://feralboy.com/log/archives/000082/("boo!":http://feralboy.com/log/archives/000073/), use an email address that you check more often than every 6 months, even if it means having to wade through pages of spam, otherwise you might miss your domain renewal notices. Doh. I've still had it with them, and based on "this glowing review":http://www.kungfugrippe.com/previously/002447.php, I'll be switching my domain name to "Dotster":http://www.dotster.com/ today. They "spam-protect":http://web.dotster.com/products/domaintools/PrivacyPost.php your email address for you! How cool!

DNS woes

Seem to be having some DNS problems with the site last night and today; couldn't get my mail last night, and couldn't hit the site (at least from home.. I think the DNS is cached here at work). I used a "web-based ping":http://www.microtech.co.gg/dns/utilities.php tool, and that also couldn't do the lookup, so maybe it's not just me. Sent a message off to my "host":http://www.alentus.com/, so here's hoping they can resolve the problem quickly.

Long weekend

Haven't really posted in awhile; but that's because there hasn't been much going on. Ryan was in town this weekend, which was awesome, and we raged a little bit. Even thought it was a long weekend, it feels like he went back to Philly too soon. Also did lots more work on my "BlogShares Client app":http://feralboy.com/bsclient/. I added some simple charting of your net worth last night, and some other nice things. It's amazing still how fun this little project has been, even with all the frustration.

Weather generally sucked all weekend, although I did manage to get a bike ride in Sunday. I'll need to do more of that, because I stepped on the scale last night, and it was a bad scene. I don't weigh any more than usual, but my body fat ticked up a percent... just the opposite of what I want. Today will start a slightly more rigorous program of diet and exercise; _especially_ more time climbing. I feel like I've let biking get in the way of that a little, so tonight I plan to go in and have a serious workout. I want to hurt when I leave, and then I'm going to do it again tomorrow night, too. I've felt weak climbing lately, and I don't like feeling that. Time to start working hard at it again, as it's the only way I'll push through this plateau I'm on now.

BSClient 0.5 source release

Details and download of -my- the BlogShares Client Application. *Update*: "Blogshares":http://blogshares.com/ "bit the dust":http://feralboy.com/log/archives/000709/. Over, done, nada, fini. I've removed the downloads, since nobody should need them anymore.

*Update 2*: Looks like "the site is back":http://feralboy.com/log/archives/000725/, but I don't feel like maintaining the application anymore. The API(Application Programming Interface) "has been disabled":http://blogstreetjournal.com/modules.php?name=News&file=article&sid=33 for the time being, but if/when it returns I have no interest in continuing development. Even if the API doesn't come back, it wouldn't be too hard to change the underlying system calls to use "screen(Screen Scrapes in ASP.NET)":http://www.4guysfromrolla.com/webtech/070601-1.shtml "scraping(Screen Scraping with C# for ASP.NET)":http://www.codeproject.com/aspnet/weather.asp "instead(Screen Scraping in ASP.NET)":http://www.csharpfriends.com/Articles/getTip.aspx?articleID=210. I've posted the "latest version(Download BSClient 0.5 source)":http://feralboy.com/bsclient/BSClient_0.5_src.zip of the source code, so feel free to take a whack at it yourself. This release contains some previously unreleased features, including rudimentary net worth charting (using "ChartFXLite":http://softwarefx.com/SfxNetProducts/CfxLiteforNET/, which I have included in the source package). Please note that this is an unsupported release; heck, they're _all_ unsupported as of now. That means don't send me emails about it, because you'll either get an unhelpful reply, or none at all. Requirements:

* Windows 2000/XP only. * ".NET Framework":http://msdn.microsoft.com/netframework/downloads/howtoget.aspx needs to be installed on your machine. I know it works with 1.0, and I would assume it works with 1.1, as well. If you don't have it, get it through "WindowsUpdate":http://windowsupdate.microsoft.com. * A "BlogShares":http://www.blogshares.com/ account. Duh. * You should probably be a premium member. You will probably hit your trade limit pretty quickly otherwise. I'm considering making the app only work with premium members, as you can get around the 2 searches a day restriction with the app. "Pony up":http://www.blogshares.com/upgrade.html, you cheap bastards!

_Alright, so what does this thing do?_

* Log in and see your portfolio. Sort by all columns (pe/price/etc). * Search and buy ideas! * Perform custom buy/sell actions on selected items in your portfolio. Buy maximum available shares, buy exactly 5 shares, sell 10% of held shares, sell max, etc.) * Perform the same buy/sells on ideas. * Fancy uber-update function that goes through your entire portfolio, buys available shares in any blogs with shares available, and sells all shares in blogs where there are no available shares and it's been 6 hours. * Search function. All standard criteria, and then sort results, and perform custom buy actions on selected results (same as portfolio buy).

_Ok, right now it sucks. What else are you planning on adding/fixing?_

* Ability to save your searches. * Display in the app of current portfolio info (total net worth, etc.). * Some sort of Systray icon, with fun little popup info, like your current worth, etc. * -Sometimes you'll get errors when you use the "select all" checkbox to select items in the portfolio or search results. I know. It seems to happen if you select all, uncheck a few, and then check select all again. Just hold down the "Y" key until it all goes away. (Thanks, JW)- * -I'll be adding support for Ideas. To what degree is yet to be determined.- * -I need to add multi-threading into the app. Right now when you perform a long operation (like downloading your 1000-blog portfolio from the server), the interface will freeze. I'm working on it.- * -I think right now it only finds blogs in your main folder.- * -Right now it calculates the time based on Eastern Standard Time. Tough. When a GetTime() function is added to the "API":http://www.blogshares.com/api/, this will go away. Or when I add some sort of user-configured offset setting, whichever lets me be lazier. If you want to change it now, feel free to tinker with the source code.- * -I'll be adding custom filtering to both portfolio and search results grids, i.e. show me all items in my portfolio with a PE between 40 and 60.- * -Getting the "Last Transaction" column to display the full date/time.-

_Enough warnings already! Gimme!_

No, not quite yet. Time for some disclaimers:

* This is free. I don't give a shit what you do with it, unless you try and sell it for actual money or sex. That money and/or sex should go to me. Otherwise, take the program and go nuts. * I make no claims about the code, other than there's not some nefarious worm or virus in the executable. I'm not responsible for anything this code does to your machine, including causing your computer to burst into flames and spew molten ceramic all over your bedroom. No, I wouldn't trust me, either. Take the source code and compile it yourself, then. _Now includes GPL Minty Freshness!_

Alright, on to the fun.

"-Download the executable-(Download BSClient 0.4)":http://feralboy.com/bsclient/BSClient_0.4.zip Just unzip it into any folder and run. Simple as that.

"Download the source code(Download BSClient 0.4 source)":http://feralboy.com/bsclient/BSClient_0.5_src.zip (for you fancy hax0r types) This includes the visual studio project file, so just open it up and compile. Don't ask how to compile with the command-line compiler (csc.exe), 'cause I don't know.

_I wanna tell you just how much this sucks._

* If you have constructive criticism or ideas for features, the best thing to do would be to add a comment to the bottom of this post. * All messages telling me how I'm ruining BlogShares by letting people buy faster than they should be allowed will be gleefully ignored/deleted.

h5. Version History:

h6. Version 0.4

* Added support for ideas! Now you can search on ideas, select all and purchase with just a few clicks. Also full handling of ideas within your portfolio. * Fixed annoying "select all" bug. * Added filtering by folders, so you don't accidentally sell off stuff in a subfolder. * Start of storing application data. Right now all it does is save your UserId after a sucessful login and populate the box for you next time.

h6. Version 0.3

* Added threading! Now the interface won't hang, and you should be able to overlap actions (i.e. perform a search while you're selling from your portfolio), although that might do weird things to the progress bar. * Removed need for setting timezone. Found "DateTime.UtcNow":http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDateTimeClassUtcNowTopic.asp function. (slaps self on forehead) I love .Nizzle! * Overhead reduced by using GZip (using "#ZipLib":http://www.icsharpcode.net/OpenSource/SharpZipLib/) compression on responses to lower the amount of bytes transferred. Data is also being cached more on the client side to cut back on trips to the server. * Client now identifies itself with a "custom UserAgent":http://feralboy.com/log/archives/000420/. * Fixed the display of datatypes on the Portfolio grid. Still need to do the same for the search results. * Source code is much nicer now. Grouped most everything by logical functions, and started to split out some common functions into classes. * Added an "About" dialog to show copyrights.

h6. Version 0.2

* Added "GPL license":http://www.gnu.org/licenses/gpl-howto.html. * Cleaned up soucecode slightly. Added comments to headings in most functions. * Added a textbox to add your hours offset from UTC.

h6. Version 0.1

* Initial release.

HMOs can kiss my ass.

_[Ed. I sent this through the general comment form on Highmark BCBS(Blue Cross Blue Shield)'s site earlier tonight]_ To whom it may concern,

Your website is a navigation horror.

Furthermore, I am unable to use your provider search with either Internet Explorer 6 (used by more than 50% of all Internet users (see "http://www.thecounter.com/stats/2003/May/browser.php":http://www.thecounter.com/stats/2003/May/browser.php)) due to a javascript error when submitting, or with Mozilla Firebird, version 0.6.

This horrendous error, combined with the fact that it has taken more than 10 weeks to be reimbursed for a prior office visit (granted, not the problem of the web team, but an indicator of the same bloated bureaucracy), makes me wish that, as evil as _they_ also are, UPMC's private healthcare division would push you out of this region for good.

I wish you good day.

(footnote) I'm unable to even submit this feedback form with Mozilla. Please get your collective heads out of your asses.

GZip compression and changing UserAgent

Just in case you ever wanted to use the .NET Zip Library to receive GZip-compressed content from a webserver, as well as sending a custom UserAgent string to identify your app, here's how you do it:

        /// <summary>
        /// Used to send out a custom application UserAgent, and return a string from a GZip-compressed
        /// response.
        /// </summary>
        /// <param name="strUrl">The url you want to retrieve.</param>
        /// <returns></returns>
        public string GetWebRequest(string strUrl)
        {

            StringBuilder mySB = new StringBuilder();

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl); 
            // Sends the HttpWebRequest and waits for the response.  
            request.UserAgent = "BSClient 0.3";
            request.Headers.Add("Accept-Encoding", "gzip, deflate");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
            // Gets the stream associated with the response.
            Stream receiveStream = GetGzipStream(response);

            Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
            // Pipes the stream to a higher level stream reader with the required encoding format. 
            StreamReader readStream = new StreamReader( receiveStream, encode );
            Char[] read = new Char[256];
            // Reads 256 characters at a time.    
            int count = readStream.Read( read, 0, 256 );
            while (count > 0) 
            {
                // Dumps the 256 characters on a string and displays the string to the console.
                String str = new String(read, 0, count);
                mySB.Append(str);
                count = readStream.Read(read, 0, 256);
            }
            // Releases the resources of the response.
            response.Close();
            // Releases the resources of the Stream.
            readStream.Close();

            return mySB.ToString();

        }

        /// <summary>
        /// Used in place of GetResponseStream().  This function will check out your HttpWebResponse's contents,
        /// and return the proper string representation of the HttpWebResponse stream.
        /// </summary>
        /// <param name="response"></param>
        /// <returns>String representation of the HttpWebResponse</returns>
        private Stream GetGzipStream(HttpWebResponse response)
        {
            Stream compressedStream = null;
            if (response.ContentEncoding=="gzip")
            {
                compressedStream =  new GZipInputStream(response.GetResponseStream());
            }
            else if (response.ContentEncoding=="deflate")
            {
                compressedStream = new InflaterInputStream(response.GetResponseStream());
            }

            if (compressedStream != null)
            {
                MemoryStream decompressedStream = new MemoryStream();
                int size = 2048;
                byte[] writeData = new byte[2048];
                while (true)
                {
                    size = compressedStream.Read(writeData, 0, size);
                    if (size > 0)
                    {
                        decompressedStream.Write(writeData,0,size);
                    }
                    else
                    {
                        break;
                    }
                }
                decompressedStream.Seek(0, SeekOrigin.Begin);
                return decompressedStream;
            }
            else
            {
                return response.GetResponseStream();
            }
        }

Notable Quotables

Best two quotes from the weekend: _[While checking in at the campground with the creepy campground manager guy]_ CCMG(Creepy Campground Manager Guy): What kind of car are you driving? Friend: A silver Honda CRV. CCMG: Gray. You're in "West Virginia(FeralBlog - WV Shootings)":http://feralboy.com/log/archives/000407/.

_[At a Mexican restuarant on our way home]_ Kid: _(looking at woman's large and, IMHO(In My Humble Opinion), ugly tribal tattoo on her back)_ Why do you have a tattoo there? Woman: Well, why do you have arms?

Breakfast

Back at the Cathedral Cafe... got a little bit of a later start, and we have 3 extra people with us today, so we had to wait a little while longer for our table. They actually wound up giving us a large round table that had been reserved for another party, but I guess they didn't make it here in time. I have french toast coming... mmmm... Climbing yesterday went OK; I was right about not really having any endurance. I only did 5 routes, but a few were things I hadn't done before, and they were fun. At the end of the day I went to go do an easy 11a that I've never quite sent. I think I had psyched myself into thinking it was going to be super-easy, so I had a horrible time on it first go. I was cursing and yelling and completely annoyed with myself, which never happens to me on routes; I usually just don't care that much. I finally fought to the top, came down, and April went. She had a bad time as well, and forgot her sequence for one part, so she actually wound up bailing, which meant that I needed to go up and get my draws off. In a Hollywood story, I would have gone up and pissed all over it. It didn't quite happen that way, but it was close. I was one move from sending, and forgot about one key hold that I hadn't seen last time, either. It wasn't the best ending to the day, but it made me feel a lot better.

Today we're going to a different area, and there is a 12a and an 11d right next to each other with my name on them.

Summersville Saturday

At the Cathedral Cafe in Fayetteville right now, finishing up breakfast, checking the weather, and getting ready to go climb all day long. We got down around 11 or so last night, set up our tents, and passed out. I love coming down on Friday nights, because then you just get up and go Saturday a.m., and then when you get back, your stuff is already all set up. We're meeting up with some other friends today, including "Seth":http://crag-rat.net/, who's finally back from his climbing accident. Fire and beer and hotdogs.. woo! I haven't been climbing routes at all lately, and I have no endurance, so today is gonna be all about 5.11c and 5.11d. I _will_ have to get on Reckless Abandon (5.12b/c) tho, just because it's so gorgeous, and April wants to TR(Top Rope) it.

Call me Clarence Thomas

Some of the other developers at my job that work on another unrelated piece of software pulled some serious all-nighters over the last few days. All fine and dandy, except that they drank all of my "soda(The Pop -vs- Soda Page)":http://www.popvssoda.com/ that was in the mini-fridge in the process. It was only slightly bothersome, but what I _really_ didn't understand is that they drank all the caffeine-free diet Coke! There's no caffeine in it! Or sugar! No stimulants whatsoever! Why?!? I picked up another 12-pack of caffeine-free diet Coke today, and decided to be a little bit more proactive. I got some Post-It notes, and affixed one to each can when I put them in the fridge. On each one, I wrote "I put my genitals on this".

Matt Comroe, Plutocrat

I've now "hit $1 billion(my BlogShares profile)":http://blogshares.com/user.php?id=3179 on "BlogShares(BlogShares home)":http://blogshares.com/. Woo. A lot of it has to do with tweaking the search I've been using for automated buys with the "early implementation(FeralBlog - BSClient)":http://feralboy.com/log/archives/000396/ of my "BSClient":http://feralboy.com/log/archives/000387/. I hope to be able to do some more work on it tonight, after "climbing(Climbing archives at FeralBlog)":http://feralboy.com/log/archives/climbing/.

BSClient

Got some work done on "the client":http://feralboy.com/log/archives/000387/ over the weekend, as you can see below: "!/images/bsclient/bsclient1_thumb.png (ScreenShot 1)!":http://feralboy.com/images/bsclient/bsclient1.png "!/images/bsclient/bsclient2_thumb.png (ScreenShot 2)!":http://feralboy.com/images/bsclient/bsclient2.png "!/images/bsclient/bsclient3_thumb.png (ScreenShot 3)!":http://feralboy.com/images/bsclient/bsclient3.png

It was very easy to get the basic buy/sell logic implemented (in fact, I did it the same day the API(Application Programming Interface) was released), but getting the interface put together is going to take a bit longer, I think. The main reason for this is that WinForms are teh sux0rs. Working with DataGrids in WinForms is _nothing_ like working with them in Web Forms. You can't access any of the controls in the grid directly; you need to get at the underlying DataTable instead. So, to add a checkbox column, you have to create a new Boolean DataColumn, append it to the end of your XML(eXtensible Markup Language)-based datatable, and then set it as the datasource. Of course, reordering said columns is a tremendous pain in the ass, but that doesn't really matter anyway, because of the the fact that the datatype doesn't get set right just from reading the XML(eXtensible Markup Language), so after I bring it down, I have to create a new DataTable from scratch, set the right column DataTypes, add them to the DataTable in the right order, and then copy data from the XML(eXtensible Markup Language)-produced DataTable to my new one. Once the DataType is set right, there's automatic sorting on columns, without having to write any code, which is cool. It also supports automatic adding/deleting/editing of rows, but that doesn't really help me here, since all actions have to go through the API(Application Programming Interface) anyway, and can't just be done through a merged DataTable.

Things that I know I have left to do, based on "input from other users":http://www.blogshares.com/forum/viewtopic.php?t=2771 and just thinks I know need to be improved:

* "Implement threading":http://www.developer.com/design/article.php/2244501. * Flexible buy/sell options from either the portfolio interface or a search interface. Buy all available shares, sell 1% of total shares, etc. * Add login! Right now my UserID and pwd are hardcoded. Naughty! * Figure out how best to store searches for a user. Local XML file? * Consider pros/cons of making app only for "Premium Members":http://blogshares.com/upgrade.html. The app really is for power traders, and I also don't want to give people the ability to store a whole bunch of searches if they aren't premium, as non-premium members can only store 2 seaches. People need to pony up the $15. * Work on filtering of portfolio. This won't be hard, technically, but I'm bad at WinForms design, as I haven't really done it before. Do I put it all on one page? Have a modal dialog that pops up for entering filter criteria?

W32.Blaster

As wave after wave of "Blaster":http://www.microsoft.com/security/incident/blast.asp "continues":http://wireservice.wired.com/wired/story.asp?section=Technology&storyId=772980 to wash over the net, I'm just enjoying looking at my firewall logs. About 1000 pings turned away in the last 12 hours, and 98% of them are on port 135, which means that it's almost all Blaster traffic. I have a feeling that "windowsupdate.microsoft.com":http://windowsupdate.microsoft.com/ is gonna get _pummeled_ Saturday.

More Job-hunting madness.

More "Bad Idea Jeans":http://feralboy.com/log/archives/000352/... got this email from a buddy of mine yesterday. Names changed to protect the innocent. bq.. Hey Matt,

You've gotta see what this complete dumb-fuck headhunter did. I'm actually not looking for a job right now, but always respond to them with a high salary requirement to see what bites. Anyway, one day a dork named Gil calls me and asks for my resume/salary requirements. The next day his partner Bob leaves a message on my voicemail. So I email Gil to let him know that Bob called. This is what I got in my email. The shithead Gil sent me an email intended for Bob. What an idiot.

Take it easy!

Bud

-------

Bob

I left you a voice mail on this also. I am still working on figuring out how to not have people fall between the cracks. Anyway here is an update on a few guys. I am going to review all candidates/names tomorrow to see what I might have missed. Also, let me know if there are any names you can think of that we have somehow not completed.

You gave me four names via phone last week.

Bud _[Ed. My friend]_ (see following email) sent me his resume. He said he was making $xx,xxx as a salary. Hard to believe with his background but because of that I never bothered to call him. He has the correct background for PPS but only if his costs are in line. I do not want to talk with him if he wants way more than Jay Pan can pay. Let me know what you would like me to do.

Scott W., just took a job and is not interested.

Rich G. is the guy who said he wants to get out of programming and back into networking. Did not seem too sharp. Has a one year diploma from a tech school.

Steve C. His number 724-555-1212 was disconnected.

Gil

p. My buddy sent the message back to him saying "I think you meant to send this to Bob." What a jackhole.

BlogShares Developer API

What started off as a fun and interesting time-waster looks like it might turn into a fun little side programming project now. The fine folks at "BlogShares":http://www.blogshares.com/ have released an "XML(eXtensible Markup Language)-based API":http://blogshares.com/api/. What's exciting is that this morning trading functionality "was added":http://blogshares.com/news.php?id=249. This means that by passing the appropriate querystring you can "execute a buy order(Example of a successful buy order)":http://blogshares.com/api/successful_buy.xml without logging into the site. So, since I'm feeling a little stagnant these days, programming-wise, I'm going to work on building a C# Windows Form application to act as a trading proxy... a "bot", if you will. The idea is that I already have a few set "queries(Example query that returns the first 500 blogs that have public shares between 1000 and 5000)":http://www.blogshares.com/api/query.php?publicshares_min=1000&publicshares_max=5000 that I use to accumulate money outside of major actions like "hostile takeovers(My takeover of /.)":http://feralboy.com/log/archives/000346/. It's fairly repetitive; run query, buy 1250 shares of all blogs in that query. Wait 20 minutes. Buy another 1250 shares in the same blogs. Lather/rinse/repeat until I've purchased all available shares, raising the price a few hundred percent in the process. Wait 6 hours, and dump all shares. The way I figure, I can automate the whole thing. Here's my rough idea of how this will work:

# Pull the results of the query into a "DataSet(DataSet class on MSDN)":http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataDataSetClassTopic.asp. Initially since I'll only be using this application myself, I'll have my queries hardcoded in, but I'll work on either a) having an interface in the application to be able to dynamically create queries or b) being able to pull stored queries from my BS(BlogShares) account. # Step through dataset and fire off a buy transaction for each record. I'll want this to be threaded (but nicely, so I don't pound the BS(BlogShares) server... maybe only 5 threads at a time), so I'm guessing I can borrow some code from "this article(MSDN - Creating an Online RSS News Aggregator with ASP.NET)":http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnet-createrssw-aspnet.asp on creating an RSS(Rich Site Summary) news aggregator. # Have another process which looks at stocks in my portfolio for blogs that still have public shares available, and I haven't bought in the last 20 minutes (the limit for consecutive purchases of the same blog), and buy available shares of those. # A third process which will sell off any stocks that haven't been bought in the last 6 hours (again, a game limitation) and remove the stocks from my portfolio.

I'm getting excited about the prospect; I think it will be a cool/interesting thing to do, and I'll be posting sourcecode/files along the way, if I think that anything is worth sharing with people. ;-)

Road rizzage

Went out for a quick little after-work "bike(Bike category archives on FeralBlog)":http://feralboy.com/log/archives/bike/ ride Monday night... a 20-mile jaunt down through town and back. While riding down the main drag in "Squirrel Hill":http://www.city.pittsburgh.pa.us/district8/html/squirrel_hill.html, I was stopped at a light. The light going the other way turned green, and a cute little old black man, replete in a slightly worn suit and a beret started to cross the street. A young guy turning left nearly hit the man, and then sped off. The man was so incensed, that he actually yelled "Crazy "Cracka(UrbanDictionary/cracka)":http://www.urbandictionary.com/define.php?term=cracka!" at the departing car. I was dumbfounded; I thought that sort of thing only happend in "blacksploitation('I'm Gonna Git You Sucka' on IMDB)":http://www.imdb.com/Title?0095348 movies.

I dream of Woods

I had a strange dream this morning. I dreamed I was at a local "B&N":http://bn.com/, and I saw a man with gray hair over at the "James Woods(Great interview with James Woods on salon.com)":http://www.salon.com/ent/feature/2003/07/31/woods/index_np.html section of the store (apparently in my dream Mr. Woods is an author as well as an "actor(James Woods on IMDB)":http://us.imdb.com/Name?Woods,+James). Upon closer inspection I realized that it was indeed James Woods, and as I watched him from a few aisles away, he was checking his section up and down to see how well-stocked this particular store was with his wares. "What a narcissistic bastard!", I thought to myself. "I need to send this to "Gawker Stalker":http://www.gawker.com/archives/008075.html, ASAP!" Turns out he was giving some sort of lecture or something. In the lecture hall (because apparently they have _those_ as well at B&N in my dreamworld), I had left my laptop at one of the desks, and I was trying to sneak in such that I wouldn't disturb the lecture. I knew that if I threw James Woods off of his game, he would tear into me like a "hawk into a chihuahua(Gothamist: Hawks Vs. Ratdogs)":http://www.gothamist.com/archives/2003/08/07/hawks_vs_ratdogs.php, so I very carefully crept to the desk, retrieved the laptop, sent my email to tips@gawker.com, and the world marveled at my fantastic sighting.