Consultant, author, and Microsoft Regional Director (not an employee title, but rather an honorary designation bestowed upon prominent community members) Bill Wagner presented tonight at the NW Ohio .NET User Group (NWNUG) meeting. His topics: Generics in C# 2.0, and LINQ in C# 3.0.
Perhaps having Greg Huber and myself in the same room is bad luck for hardware, for Bill had a little struggle in getting the presentation going. After a reboot and a couple of anecdotes, we were on our way.
Bill, of course, is the author of the highly acclaimed book Effective C#: 50 Specific Ways to Improve Your C#, which I guess kind of makes him an expert on the subject of C#. That didn't stop Scott Wiltamuth from recommending Bill's own book to him at the PDC this past year!
During one of his vamps, Bill pulls out a fresh copy of his book and slides it across the table to me. He then explains to the group that he wanted me to have one that was properly signed (which this copy reads: To Jason, Thanks for inviting me to speak at your group. Bill Wagner)
Now, to understand the significance of this gesture, I need to first take you back to probably the mid 1990's. I was doing a lot of Visual Basic 4 programming, and my definitive source of information was Carl and Gary's Visual Basic Homepage. At that time, the internet was actually not the wealth of information that it is today, and I'm not even sure what the state of the MSDN web site was (if it even existed). But, everything that I needed to know could be found at good ol' CGVB-dot-com.
Jump ahead to maybe 1997. I receive as a Christmas gift a book on Internet programming using Visual Basic 4. It soon became the catalyst that led me into protocol-level programming because I was truly amazed by just how simple these Internet protocols really were. The author of that book: The same Carl from CGVB.com. Cool.
My life then transformed from doing pure Visual Basic programming to web programming, and I spent a great deal of my professional life dealing with angle brackets, client-side scripting, and OSASPADO (Old-School ASP/ADO) on the backend. My visits to CGVB completely stopped, and Carl's book was stored away in a box. I swear it was like the scene in Toy Story 2 when the little girl got rid of the Jessie, the Yodeling Cowgirl, complete with a sad song by Randy Newman. /me wipes away a tear.
Zipping ahead to April 2005 (we'll be getting back to Bill Wagner in just a second, so hang in there): I attended a MSDN event that Bill Steele presented at. Part of the swag that was given away included a DVD loaded with content, including the first 100 episodes of this Internet radio talk show named .NET Rocks!. "I'll have to give that a listen," I thought. BTW, it was after this same MSDN event that I discovered that there was a .NET User Group in Toledo.
So, it began. While working at a client's site, I listened to 2-3 episodes of DNR each day. After a month and a half of a diligent listening schedule, I was completely caught up. Once again, that Carl guy had somehow snuck back into my life. (And, I also found a certain appreciation for the personality known as Rory)
I was really impressed by this sense of community that existed. It was almost like a fraternity, with folks from all over the country (and the world) sharing in their passion for Microsoft technology. Most importantly, I learned that there were others who shared in my beliefs that Microsoft was better than Java. (If you're still reading at this point, you know that I'm trying out some tongue-in-cheek ideas here, right?)
I had the opportunity to actually meet the current DNR duo while I was in San Francisco late last year for the Microsoft Joint Launch Event. I think that it's no secret to readers here that I'm a big fan of Carl Franklin the Podcaster, the Musician, and the Regional Director, so being able to ever so briefly hang out with him was a big highlight of 2005 for me. DNR was the catalyst for me becoming involved in the community.
The day after eating boiled ribs with Carl and Richard at the post-event party, I flew back to Detroit for our own regional version of the same event. There, I met Bill Wagner for the first time. I had taken his book with me to SFO, so as we were standing there at the User Group booth, I pulled the book out and asked if he would sign it. Having no clue who I was, I think that he simply looked to me for guidance about what to write in the dedication. It was then that I said, "To Jason, With Love, Carl Franklin" (as if I didn't know or cared who Bill was). To his credit, Bill actually wrote something to that effect. Party on!
Thanks for the replacement book, Bill! Though, the original one is certainly not going anywhere!
Tuesday, January 31, 2006
Consultant, author, and Microsoft Regional Director (not an employee title, but rather an honorary designation bestowed upon prominent community members) Bill Wagner presented tonight at the NW Ohio .NET User Group (NWNUG) meeting. His topics: Generics in C# 2.0, and LINQ in C# 3.0.
Monday, January 30, 2006
So, I was looking over my referrer logs today, and I noticed a visitor coming from:
Interesting! Someone linked to me!
I investigated, and found that there's a short (5 minute) podcast called The WHERE Clause that seems to highlight some of the interesting blog posts that Chuck Boyce has found while browsing the blogosphere.
At the end of today's podcast (1/30/2006), my post linking to the fact that Jim Holmes posted some photos from the Code Camp last week was highlighted, with particular note from Chuck about the mountain o' swag!
Neat little podcast, though I would recommend using Shrinkster to shorten the URL's.
Posted by Jason Follas at 1/30/2006 02:56:00 PM
Exxon Mobil posted their Q4 numbers. Their profit for just October-December 2005: a whopping $10.71 Billion. That's $10,710,000,000 for you numerically challenged folks, and that's all PROFIT!
Tell me there's no collusion between oil companies to keep oil prices high. Tell me that the oil companies don't giggle like little girls when there's turmoil in the middle east, or hurricanes in the Gulf, or when tree huggers successfully prevent exploration/drilling on U.S. soil because they know that the futures will continue to go up, which obviously (according to this news story) increases their profits as well.
Do you know why the price of gas is $2.30/gal at the pump? Because the oil companies haven't found today's excuse to charge $2.31. (credit for this insightful joke goes to an ex-employee of Marathon Oil Company)
I'm pretty conservative and pro-business, but not for energy or utility companies. For those, I believe in heavy regulations and tight controls on profit margins.
Posted by Jason Follas at 1/30/2006 09:48:00 AM
Sunday, January 29, 2006
I may be a few days (years?) late, but what the heck. This joke is one of the best ones that I've seen in a while (and it's clean, too!)
Posted by Jason Follas at 1/29/2006 06:20:00 PM
Friday, January 27, 2006
I saw an article today about a new system to help route elevator traffic. The concept is that you visit a kiosk in the elevator lobby, and based on what floor you're going to, it will tell you which car to wait in line for. Kind of like packet routing for people.
That reminded me of an elevator hack that I learned of quite some time ago. I haven't performed scientific tests to guarantee that it works, but it seems to:
To avoid stopping at multiple floors for people to get onto your elevator car, hold down the Door Close button at the same time that you select which floor you want to go to. On some of the more popular/newer elevators, this will have the same effect as using the Fireman Mode, and will take you right to that floor, regardless of whether there are people waiting on floors in between to ride in the same direction that you are heading.
Like I said, it might not work for all elevators, and I bet that property owners have the ability to disable this feature. But, after learning about it, I've been quite successful in using this hack (be that merely coincidence or not).
Give it a try the next time you're going up!
Posted by Jason Follas at 1/27/2006 05:51:00 PM
While I didn't officially make a New Year's resolution, I do want to use more of the developer tools that Agile methodologies have made popular.
For instance, I'm pretty set in my ways, so this whole test-driven development thing is going to be a real challenge to me. But, I see that resistance is futile, so I'll join the Borg now.
One thing that I'm exploring is the role that Continuous Integration provides while working on a project. What this is, as best as I can describe it, is a way of automatically building the project's source code, running tests, and reporting on the results. This way, at any time, you can always get the latest build, and assuming that you have unit tests, can be sure that the latest build passes all tests.
One tool to facilitate Continuous Integration for the .NET platform is CruiseControl.NET. I was first introduced to CC.NET by an article in CoDe Magazine last year written by Dr. Neill in his screenplay-like writing style.
Well, I have successfully configured CC.NET to retrieve the latest source code from Visual Source Safe 2005, build it using MSBuild, and maintain stats through a web application that it provides. A step in the right direction, to say the least.
The CCNET web application includes a link to CCTray (a Win32 client for CC.NET), which points to a path within the CCNET virtual directory structure:
When I first clicked on this link, I got a 404 Page Not Found error. "Hmm, that's weird. Why would they not include the setup file that the link pointed to?" I thought to myself.
But, while exploring the server, I noticed that the file was indeed there. Why would IIS return a 404 then?
Well, as it turned out, the CCTray virtual directory was set for "Scripts and Executables". This means that when I requested the EXE, that IIS tried to run the EXE on the server (think CGI) instead of sending me the file's bits through the response stream. In fact, the whole ccnet web application was configured for "Scripts and Executables" out of the box!
The obvious fix was to change the web application permission to just "Scripts". This allows ASP (and ASP.NET) pages to run without trying to execute binaries on the server if and when they are requested.
I'm hoping that we'll see more pics uploaded, maybe to Flickr or something. But, Jim Holmes has posted some photos of last Saturday's event on the Dayton Dev Group site:
Check out the mountain of swag that was given away at the end of the event (primarily hundreds of books)!
Thursday, January 26, 2006
There are a couple of television shows that I personally don't miss each week. One is LOST on ABC, and the other is Ghost Hunters on SciFi.
Just this week, I received a belated present: the first season of GH on DVD. Now I can finally free up about 30 GB of hard drive space on my HTPC that has held those episodes all this time.
One interesting thing that I never noticed before: The Race Rock lighthouse (Episode 104) is also off the coast of New London, CT (home of Carl Franklin, as well as the shipyard that builds our Navy's nuclear submarines). I had previously blogged about another lighthouse in New London that the TAPS team visited in season 2, but never picked up on this fact for Race Rock until I watched the DVD.
Oh, and the internet makes it truly easy to find out where just about anyone lives. For instance, TAPS fans, here's Jay's house with the old TAPS HQ (a trailer) in his front yard:
Posted by Jason Follas at 1/26/2006 08:58:00 PM
Consider the following number:
That's the number that was stored within a varchar field in my client's database. A stored procedure was trying to take the sum of this column and store the result into a decimal(18,2) column of a different table. The author of the stored procedure was smart enough to check for numeric values before blindly trying to take the sum, as in the following:
sum(case when isnumeric(theField) = 1 then cast(theField as decimal(18,2)) else 0 end) as theFieldSum
If you think this is the right way to have accomplish the task, then I'll admit that I was the author. Otherwise, we don't know who wrote this. ;-)
Anyways, the number above is considered numeric by SQL Server, and in fact, you can cast it to a float without problems. However, try casting to a decimal(18,2), and you get:
Msg 8114, Level 16, State 5, Line 11
Error converting data type varchar to numeric.
The exact behavior is documented in the BOL:
Character expressions that are being converted to an approximate numeric data type can include optional exponential notation (a lowercase e or uppercase E followed by an optional plus (+) or minus (-) sign and then a number).
Character expressions that are being converted to an exact numeric data type must consist of digits, a decimal point, and an optional plus (+) or minus (-). Leading blanks are ignored. Comma separators, such as the thousands separator in 123,456.00, are not allowed in the string.
Posted by Jason Follas at 1/26/2006 01:47:00 PM
A few days ago, it was announced that FirstEnergy Corporation has to pay $28MM in fines for lying to the government about the dangers of it's Davis-Besse nuclear power plant:
That plant is a mere 20-30 miles from me, and about 5 years ago, the reactor head was so badly corroded from leaking acid that we could have had a serious nuclear disaster here on the shores of Lake Erie.
Supposedly, none of that fine is permitted to be passed on to FirstEnergy's customers (ratepayers). How are they going to enforce that? FirstEnergy makes money by generating electricity, which their customers buy. So, how are you going to keep the various monies separate? Somehow, I just don't see FirstEnergy (or, more locally to me, Toledo Edison) suffering as much as I will over time. I can even foresee rate hikes in the name of "increased energy costs" that will somehow restore that $28MM to their bottom line. This, despite the fact that FirstEnergy made close to $878MM in PROFIT (6.8% of revenue) alone last year. I have a real problem with utility companies continually increasing rates when they are already realizing huge profits, but I digress...
I say that if you really want to fine a utility company, don't simply make it a monetary fine. Instead, take it out of their rates. In FirstEnergy's case, force a lowering of rates over the current baseline for a period of time (years) until the $28MM can be realized. This way, you're ensured that the ratepayer is not paying the debt, and that they are in fact experiencing relief.
Of course, Treasury Department, or whomever is the direct recipient of that $28MM, would not receive that huge check, so we'll never see this idea come to be.
Posted by Jason Follas at 1/26/2006 12:51:00 PM
Wednesday, January 25, 2006
Rodney Fournier posted a series of humorous (but true) tips for driving in Detroit. I tried to add the following comment, but something did not work, so I just decided to post them here:
I've noticed that while driving in DEEtroit that the left turn lane is actually the right-most lane. You must turn right onto the road that you're trying to turn left on, immediately get into the left lane, and then wait in a quasi- U-turn lane for traffic to clear, and then you can turn left.
So, the observation here: the infinite wisdom of the DEEtroit traffic engineers didn't want you to turn left at a light, where they can "safely" control the flow. Instead, they want you to turn left from a U-turn lane with oncoming traffic.
But, I guess that's what no-fault insurance is for...
Oh, and if you happen to be on a side street (i.e., not a Mile road or major North-South road), left turns do exist. But, when you're first in line at a red light, and that light starts flashing, that's actually a cue that you can turn left after yielding to oncoming traffic. Waiting for a green light will definitely get you shot.
Posted by Jason Follas at 1/25/2006 07:30:00 AM
Tuesday, January 24, 2006
I got the chance today to install Visual SourceSafe 2005 on a new development server. One of the most exciting new features that I want to play around with is the Webservice functionality (accessed via the Visual SourceSafe Internet plugin for Visual Studio 2005).
I configured the server, and changed my Source Control to the "Internet" version, but I could not connect to the web service from my client. All that I would see is the following messagebox:
Visual SourceSafe Internet
Cannot contact the Visual SourceSafe Internet Web Service or cannot access the specified database.
The server returned the following error: A connection with the server could not be established (0x80072EFD)
I next tried to connect to the web service URL from Internet Explorer. This time, I got a familiar ASP.NET error screen. But, it was hiding the true error from me due to the configuration.
So, I changed the VSS web service's web.config to set <customErrors mode="Off">
Now I got a better error message:
The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.
Now, there's something that I can finally work with!
The fix was to grant the NETWORK SERVICE account (since my machine is W2k3 server, otherwise, it would be the ASPNET account) the Modify permissions for C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files.
Sunday, January 22, 2006
Dear Audience of my Dayton-Cincinnati Code Camp Presentation,
I just realized that I started to explain something, promised that I would touch on it later, but then completely forgot. What can I say? The day was long, the hardware was not working, and everybody just wanted to play with the Xbox anyways...
Do you remember that object tag in the HTML that contained my Solitaire control? It looked something like this:
Well, that's how you would use a .NET Winforms Control as an applet within HTML, very similar to how you use ActiveX controls. But, because this is pure .NET, you have to be mindful of Code Access Security. The biggest implication is that you cannot use a "file:" protocol to point to the assembly, so that leaves web servers as the only delivery mechanism (so that the source can be verified).
But, you can add some COM Interop attributes to your code, and actually transform your Winforms control into a ActiveX control (as far as Windows is concerned). This is what I did not demo to the group.
Why would you want to do this? For starters, once an ActiveX control is downloaded, it's cached differently than .NET assemblies. The classid attribute contains just a GUID instead of naming a DLL and the object within the DLL. This means that Windows won't try to fetch the DLL from the web server each time the page loads if that GUID has already been registered in the Registry.
And this has great implications for installation of your Media Center Hosted HTML Application: your installation program can do the steps to register the ActiveX version of your Winforms control on the destination MCPC, and then you will not need a web server because the Registry entry for the object's GUID will be pointing to a local copy of the DLL.
(ok, so I blatently stole the idea to write in the form of a letter from Rory)
I attended my first Code Camp today as both an attendee and a presenter. I'm sure others will agree, but this was one of the best events that I've been to in a while.
While I realize that the formats are different, this was actually better than the last few MSDN events that I've attended (probably due to speaker and topic diversity). Surprisingly, we did not see Bill Steele there, even though I think he only lives a half-hour away. Oh, well, maybe next time...
Jim Holmes and James Avery have already made mention of a possible repeat event in the fall, and you'll most likely see something similar in format from the Michigan and Toledo groups this spring. Disclaimer: Any and all talk is preliminary and unofficial, so stay tuned.
So, my presentation story:
Greg Huber and I presented on Media Center development (the last presentation of the long day), and we were hoping that showing off the Xbox 360 as an Extender would steal the show. The night prior, we had 2 Xboxes, 1 Media Center, and 2 laptops all successfully talking to each other in the hotel room. That process went relatively smoothly, so we didn't expect much less of setting up the actual presentation.
Well, of course, the demo Gods were angry at us. Maybe it's because I ate the ham sandwich for lunch, or something. First, the Xbox's infrared media remote seemed to lock up Greg's media center whenever I used it (the MCPC also had a IR receiver, so it was receiving all of the same keypresses that I was sending to the Xbox located on the side of the room). So, that made us reboot a couple of times.
And then, there came a point where we needed to use my laptop as a web server to load my solitaire demo, and of course, the MCPC couldn't see my laptop. In retrospect, it's probably because late last night, we also tried to use my laptop as a internet connection sharing device to bridge our ethernet network to the hotel's wireless internet (we were trying to connect the Xboxes to Xbox Live, if ya have to know, but we weren't successful). I didn't remember this until just now, but I bet that set up all kinds of firewall policies on the XP SP2 firewall, and port 80 is probably blocked at the moment.
I, of course, was not in the audience, so I can't judge how well we did trying to recover from the unexpected hardware issues. My only hope is that at least my message about using .NET Winforms controls inside of HTML was useful to the audience, because that is applicable to more than just MCE/Xbox.
If you caught our presentation, I'd love to hear your personal feedback in comments. We're giving an extended version of this presentation to GANG on 2/15, and besides the obvious equipment issues, would like to know what else needs work.
Saturday, January 21, 2006
As a PSA, if you arrived to my blog's homepage looking for info on "prem_sms", "31000", and/or "mobilesidewalk", then look here:
That post has fallen off of the main page, but the search engines have not updated themselves yet.
Posted by Jason Follas at 1/21/2006 07:35:00 AM
Friday, January 20, 2006
I'm a big fan of the Xbox 360, especially since Mt. Dew paid for mine. You can't beat getting something for free in order to become a raving fan of it. But, looking into my crystal ball, I can see a scenario that will absolutely kill the mass adoption of the Xbox 360.
By now, everyone knows of Microsoft's secondary motivation behind developing the Xbox 360: to become THE device to bridge your television with the rest of the computing world. I'm not sure if I agree that the way that they're doing it is necessarily the best, and a competitor could easily take this role away from the Xbox.
You see, out of the box, the Xbox 360 allows you to access audio and images that are on your home network and play them through your home entertainment system. For example, you can listen to MP3's on your stereo, or view a slideshow of pictures on your HDTV. Microsoft, being the friendly chaps that they are, even gives away software to facilitate this. But, the other aspect of multimedia - video - does not come for free.
If you want to view video through the Xbox, then you must use another Microsoft product: Windows XP Media Center Edition. Ah, and now we see where synergy enters the picture.
Over the past couple of months, I have taken a deep dive into the world of Media Center. It truely is an interesting technology and the improvements coming down the road in the Vista timeframe will make it even better (especially how they will allow developers to enhance Xbox 360 extender experience). But I don't think it's the best piece of HTPC software out there.
I'm willing to bet that a significant population of Xbox 360 owners have no interest in buying or building a dedicated HTPC running Media Center Edition. But, that doesn't mean that they do not want the ability to watch video on their Xbox. Herein lies the fatal mistake that Microsoft is making, IMHO.
By strongly tying video playback capabilities of the 360 to another SKU that the user may or may not have, Microsoft is opening the door for Sony or Nintendo to release an open solution to allow for their consoles to serve as a HTPC extender. If this were to happen, then you know that MythTV, FreeVO, MediaPortal, SageTV, BeyondTV, GB-PVR, and every other piece of PVR software will immediately work on supporting that console as an extender.
What would Microsoft do then? They would have significant market penetration, but as we all know, game consoles are replaceable devices (even at the $400 price tag). The early adopters of the Xbox 360 will likely jump to the next big thing when it comes out anyways.
Assuming that they would still pursue the vision of the Xbox 360 being the central device in the total media experience, then Microsoft would be forced to either offer equivalent capabilities for the Xbox (via an update), open up their extender technology to the other PVR software folks, or just sit back and watch the Xbox become obsolete.
It will be interesting to see if Sony or Nintendo will think to offer this in their next generation consoles.
Posted by Jason Follas at 1/20/2006 09:58:00 AM
Sunday, January 15, 2006
UPDATE #2: Apparently, Bob didn't feel comfortable with the outcome of the interview, so they opted not to "air" the podcast:
UPDATE #1: Seems that Mr. Franklin already had a previous episode in the can, because the current .NET Rocks show is with Shawn Wildermuth. The following discussed the show that was taped last Friday (1/13/2006) with Bob Reselman:
We (the live listeners of .NET Rocks!) got lucky on Friday evening because Carl managed to get the media server working (after first announcing that it would not be up). After a few hiccups, I found myself listening to the first live stream since sometime near the beginning of December.
This week's episode was different. I'm not sure how much editing that Carl and the gang will do (I'm writing this before the episode is released), but whatever the result, don't expect a highly technical show. But, do expect to take away some common sense approaches to the business of software development. There was some great content discussed, and I'm going to give the show a second listen.
One thing that I found interesting is that Bob once worked for a company that had an open payroll policy. That is, everyone knew what everyone else was making, so there was never the thought in the back of your mind that your employer is screwing you by paying you far less than a peer. Speaking for myself, I know about that distraction all too well...
Another point that Bob made was the fact that people are too afraid of the truth. For instance, a project manager would rather have somebody lie to them about when a task will be complete, rather than an honest "I don't know" answer. In my personal experience, "I don't know" is really the best answer in a lot of cases. Sure, I could say that something will take a week, but that's a guess. It could really take 2 days, or 2 weeks.
Posted by Jason Follas at 1/15/2006 07:32:00 PM
Friday, January 13, 2006
As an owner of the Hauppauge PVR-150, and someone about to embark on a MCE presentation next week, I thought that I would learn how to pronounce the word "Hauppauge".
Hauppauge is a US company most known for its WinTV line of TV tuner cards for PCs, but is also a producer of PVR's, digital video editors and digital television products. The company is named after the town of Hauppauge, in which they are based. Hauppauge is pronounced HOP-HOG.
Posted by Jason Follas at 1/13/2006 11:14:00 AM
Wednesday, January 11, 2006
Today isn't the first time that I've programmed using Generics in C#. But, I'm so impressed at the moment, that I just have to tell someone.
I'm currently converting my GB-PVR Solitaire plugin into a Media Center Application. (I know that Media Center already has Solitaire, but it doesn't have my Solitaire, plus I'm using this as code that I can demonstrate).
The GB-PVR plugin was written using the .NET 1.1 Framework. I'm converting to the 2.0 Framework, and I'm loving Generics!
For example, in 1.1, I used a lot of Stack and ArrayList objects. I mean A LOT (more than 10 in order to manage the state of the game as it's being played). Every time I accessed an object from one of these collections, I had to cast it to my Card type:
Stack column = Columns[col] as Stack;
Card c2 = (Card)column.Pop();
This made the code quite ugly, because these casts were happening all over the place. Well, with Generics, I can use the type Stack<Card>, and all of my type checking is done at compile time. This greatly simplifies the code:
Stack<Card> column = Columns[col];
Card c2 = column.Pop();
Or, if I don't need to reference the variable "column" any futher, then I could just do:
Card c2 = Columns[col].Pop();
And compile-time type checking totally kicks the ass of run-time type checking, especially in a strongly typed language like C#.
But, there is an apparent downside. It looks as if Generic collections do not implement ICloneable, like the old Object versions do. So, I have to think about workarounds for some of the things that my code does.
A reminder to people in the Toledo, Ohio area: Bill Wagner (Regional Director, Author) will be presenting to the NW Ohio .NET User Group on this very topic (January 31, 2006 at 6PM in downtown Toledo).
Upcoming meeting information: http://www.nwnug.com/dotnetnuke/Default.aspx?tabid=31
Scott could get up in front of you, talk for an hour about beavers, and you’d probably walk away satisfied even though the talk’s title was “Obscure ASP.NET Errors That Only Scott Has Encountered”).
So, in this debut episode, you get a taste of everything that we've come to know Scott for: tools, tips, and cool technology.
For example, one tool that I was generally unaware of was TimeSnapper. Being a consultant, I am responsible for recording my time in different "buckets" for all of the various clients and projects that I'm assigned to at any one time. Well, if I forget to record my time at the end of the day (or sometimes, over the course of several days), I find it hard to remember exactly which projects I worked on, and how much time I spent.
Up until now, I've been using my email as a memory tickler, checking to see what I sent and what I received on any one day. TimeSnapper will be another tool to help me to fulfill my weekly time entry requirements.
What it does is periodically (user-defined interval) takes a screenshot of your system, and saves it to a file. You can then go back to any date/time that it was running and see what your screen looked like at that point in time.
Thanks for the tip, Scott!
(Now that I've typed this, maybe TimeSnapper is going to be a double-edged sword, because I can see how much time is spent on non-client work)
Posted by Jason Follas at 1/11/2006 09:49:00 AM
Tuesday, January 10, 2006
In early November, I went to San Francisco for the Joint Launch Event. Shortly upon returning home, I kept getting these unsolicited text messages on my cell phone, like the following:
U have 0 pts next question: What is the name of Hilary Duff's sister? A Heidi B Haytie C Yogi Berra D JoeDimaggio
Sometimes, the messages would include text like: "2 end reply stop." Once or twice, I even tried to reply with the word "stop", but I would just get a Undeliverable Message error.
So, I didn't think any more about it until I started looking at my December cell phone bill. Each of these messages were coming in at a $0.99 charge! Verizon is listing them under "Get It Now downloads" as:
Prem_sms 31000 Mobilemessager Trivia
Sigh... This is the last thing that I needed to spend time trying to resolve...
Log of Steps That I've Taken to Resolve the Issue
Unsubscribed before any further messages arrived. You're supposed to be able to do this by replying to a trivia message with "STOP" (to 31000), but every time that I tried, I would always get a Undeliverable Message response. Instead, I just used their website:
Contacted the company:
42 Corporate Park
Irvine, CA 92606
United States of America
Since I prefer to use email whenever possible, I sent the following:
Since about November, I have been receiving unsolicited prem_sms messages from 31000 to my VZW cell phone (419-410-xxxx). Sure, the messages stated that I could reply with STOP to opt out (which never worked, by the way--always undeliverable), but to my point, I never opted in to any trivia game.
Imagine my surprise when I reviewed my VZW phone bill to discover that at one point, each trivia message was being billed at $0.99 a piece, and a monthly SMS message was priced at $9.99.
I discovered your web site this morning, and used the online Unsubscribe feature to prevent any further unsolicited messages. I need to know that you will be cooperating with reversing any and all 31000 prem_sms charges made to my phone since November, in which case we can simply write this off as an accounting mistake. Otherwise, I'll be forced to believe that there is interstate fraud involved.
I received a reply from "Ashley N.":
Please fax a copy of the bill to 949 777 3707. And after reviewing it we
will someone will be in contact with you.
I complied with the request, both faxing and emailing a scanned copy of what I faxed.
I received the following reply from "Ashley N.":
I have received your fax. Please reply back with your billing address, so I can complete your request for a refund.
I replied via email with my billing address. At the end, I also requested to know how my number ended up in their system.
Never found out how my number ended up in their system, but I did get a check for the amount of the disputed charges.
The check was from:
New Motion, Inc
42 Corporate Park, Suite 250
Irvine, CA 92606
I found this while Googling(Source):
Before you enter Mobilesidewalk, READ THE FINE PRINT. In order to sign up for their service and receive ringtones, you have to agree to participate in the Mobile Sidewalk Music Trivia Challenge. As part of the challenge, you will receive trivia questions in the form of text messages at the cost of $0.99 per text (the charges will appear on your cell phone bill).
If you choose to sign up and enter Mobilesidewalk, the service will charge you a monthly fee of $9.99. However, if your phone service is through Verizon, Nextel or Alltel, don’t bother unless you just want to play the trivia challenge, these phone services are not compatible with the ringtones offered.
I don't specifically remember browsing for ringtones, since I'm not really into that, but it shows what kind of M.O. this company has: the $1 per message trivia is obviously their money maker.
Posted by Jason Follas at 1/10/2006 05:37:00 PM
Sunday, January 08, 2006
I can understand why tech savy people prefer movies in a DivX or other nefarious format: to avoid being force-fed previews and FBI warnings!
There is nothing worse than renting a DVD from the corner video store, and still being forced to sit through previews that autostart when the disk is inserted! Somehow, the MPAA has figured out a way to prevent any of my DVD controls from working while the previews are playing (same behavior as when the FBI warnings are being displayed).
Even when I pressed the Stop button, the "You can't do that" icon on the screen. No, take a moment to appreciate what I just said: the STOP BUTTON, who's very purpose is to stop the video, could not be used! And this is on a Sony DVD player!
(Update: I did some searching after writing this post, and this exact behavior is not only common, but also years old, because I found mention of it dating back to 2000. Goes to show how little movie watching I actually do.)
The movie was Mr. and Mrs. Smith. I finally figured out that the "Next" button (>>|) would skip to the next preview (so it was inaccurate for me to say that none of the controls worked), but what ever happened to just being able to press the Menu button to go to the DVD's main menu, regardless of what you are currently watching?
Now, let's think about this: If someone has the chance to watch a movie at home and have the choice between (1) just the movie, or (2) be forced to watch previews, FBI warnings, and THX sounders before the movie starts, which do you think they will choose?
I, for one, am looking forward to the legal downloads of movies sans any of the annoying features mentioned above. Let me pay, download them using a Bittorrent network, and burn them onto a DVD. Let the movie autostart right away with NO PREVIEWS. That's what I'm talking about.
Posted by Jason Follas at 1/08/2006 04:32:00 PM
Friday, January 06, 2006
There's a question on the Google Aptitude Test about resistors:
10. On an infinite, two-dimensional, rectangular lattice of 1-ohm resistors, what is the resistance between two nodes that are a knight's move away?
I don't think that the answer is as complicated as what people are making it, since every node is the same value. Here's what I think the solution is:
A knight's move is a combination of 2 squares in one dimension, and 1 square in the other dimension. So, if you imagine all of these 1-ohm resistors in a grid:
! ! ! ! ! ! ! ! !
! ! ! ! ! ! ! ! !
! ! ! ! ! ! ! ! !
! ! ! ! ! ! ! ! !
! ! ! ! ! ! ! ! !
then you're trying to find the total resistance from one intersection to another one that is, say, 2 down and 1 to the right (i.e., resistance from A to F):
Despite the fact that this is an infinite grid, all resistors outside of this area will not have any effect on the system between the points A and F.
Breaking down the network:
A-B-D = 2 ohms
A-C-D = 2 ohms
The total resistance from A-D, therefore, is 1 ohm because:
Rt = 1/(1/R1 + 1/R2) = 1/(1/2 + 1/2) = 1/1 = 1
D-F = 1 ohm
So, the total resistance following path of the network A-B-C-D-F is 2 ohms.
But, there is another network in parallel: A-C-D-E-F It's value is also 2-ohms.
In all, going from point A to F is like having two 2-ohm resistors in parallel, which we showed above to be 1 ohm total.
I'll probably build this circuit and take physical measurements, but as I type this, I think that the answer is 1-ohm.
I'd gladly admit defeat if someone who actually studied this in school has a different explanation. ;-)
Posted by Jason Follas at 1/06/2006 10:30:00 PM
Wednesday, January 04, 2006
My coworkers are currently going ape-sh1t about this social networking tool: LinkedIn. People are building out there networks, myself included (sorry if any invitations that I sent annoyed you). Most people that I have searched for were already users in the system, so this tool is probably years old... But, that's par for the course for me (catch on to things after the wave).
So, after getting people to actually accept your invitation (and become part of your network), it's cool to see just how many people you become connected to. You know, just like the Kevin Bacon game.
Speaking of Kevin, I don't know if this is truly him or not, but he doesn't seem well connected on LinkedIn (has only 1 connection):
Posted by Jason Follas at 1/04/2006 01:01:00 PM