When looking on Facebook the other day, I noticed something peculiar.
That is NOT me. Seriously, how many Logan Buesching’s are there on the internet? Windows Live tells only knows about one.
I just hope that some day he never becomes famous.
When looking on Facebook the other day, I noticed something peculiar.
That is NOT me. Seriously, how many Logan Buesching’s are there on the internet? Windows Live tells only knows about one.
I just hope that some day he never becomes famous.
I am usually a fan of open source software, but the latest two that I have downloaded are sore on my eyes and a real pain to use! The first is Media Coder, while the second is JJ MP3 Renamer. It has been my findings that open source software in general is much more difficult to use than their commercial counterparts. Maybe someday I will do a comparison of open source to commercial software and the usability between them.
I recently purchased a 120gb Zune player when I used to have an Apple IPod. I want to transfer all of my IPod stuff over to my Zune player. I was able to get songs I ripped from CD to work properly, but songs I purchased on ITunes don’t work. I am currently working on stripping the DRM from those purchased songs to add to my Zune. I realize this is illegal, but hey, I legally paid for these in the first place, so I don’t feel bad about doing it.
Lets start with the program (that I hope?) can convert the DRM laden files to non-DRM formats. I haven’t quite used the program yet, but on the first look I immediately said WTF. This is UI hell.
1.) I’m given a transcode option in the menu bar. I could pretend like I’m not an idiot, and say that my grandma won’t know what “transcode” means, but in reality I don’t know what it means. I will assume that “Convert” would have been a better choice. (Hell, even Windows Live Writer doesn’t have transcode in its dictionary!)
2.) They have some weird icons to show, one of which being the “Skip” icon which looks like someone is getting ready to soccer kick something. This reminded me of wanting to physically kick the software, which is what you see my little stick figure doing!
3.) Why is there a “…” and an “Open” button next to the folder? This is confusing.
4.) Why the hell are there so many tabs?
5.) WHY THE HELL ARE THERE SO MANY TABS!!???
6.) Why would I want to refresh rss? Do you really think I keep this application open for long enough for you to post something new? And even if I did, do you think I would want to refresh the rss feed to find out new information?
7.) WHY THE HELL ARE THERE SO MANY TABS?!?!?!
As if the first UI design wasn’t bad enough, here is another gem. This was used to rename and move around files from my IPod’s crazy directory layout into a more human readable format. Overall this wasn’t as bad as the last one, but it did take me about 5 minutes to actually figure it out.
1.) The item that has “click” next to it is actually clickable! Wow, who would know that? There is absolutely no indication that it can be clicked. In fact, there are no visual indications that anything on the screen can be clicked.
2.) Why do I have to be shown the difference between idv2 and idv3? Is there really any reason why I would still want idv2?
First Impressions With IE8 Beta 2
I have been an avid fan of Mozilla Firefox for a long time, but since I got a new job, I have been trying to exclusively use Microsoft products (at least at work). One of the things that I have been able to try out is Internet Explorer 8, Beta 2. From a first impression, I have really enjoyed it.
If you’ve ever heard me gripe about IE, it’s that it has slow tabs. When I open up a new tab in Firefox, it’s blazing fast and I’m already typing in the address bar before I know it. For IE 7, it had such a slow implementation for its tabs. It would literally take 2 full seconds from when I create a new tab to when I could use it. With IE 8, tabs open much more quickly. Although the tabs aren’t as fast as Firefox, it’s not going to be my huge gripe.
A new feature called InPrivate browsing allows me to browse the web without worrying about tracker cookies or saving my history. I’m not exactly sure what all this entails, but it seems to have gotten media attention.
Another helpful feature is that in the address bar, they have made the domain name stick out more to help avoid phishing attacks.![]()
Microsoft has a new site dedicated to providing Add On’s. With all older generations of IE, nobody really cared about having plug in’s for the web browsers. When Firefox came along, the whole game changed. Firefox gave developers a lot of flexibility for extending the browsers functionality. IE has finally caught wind of this and I am excited to see some of the additional add on’s that are going to come out.
When I first saw this feature, I wasn’t very excited at all. I thought it was going to become another toolbar helper that just gets in my way. After using it for a little while, I have stopped noticing when the little icon pops up. It is very non-invasive and there when I need it. I think the best thing about the accelerator is that it doesn’t take me to a new page to find a map or define a term, it’s all right there in the same page.
This feature is seems like it could be really cool, but still needs polishing up for the final release of IE8. I started out getting the Digg and Facebook web slice. Neither one of these slices worked as expected. The Digg slice didn’t quite show the full news when I clicked it.
And the facebook slice BROKE FACEBOOK!
Not exactly sure how that managed, but after deleting the slice I was able to get Facebook to work again.
In my opinion, those are the most major new features that are in IE8, but there are a few last items that I though deserved attention.
In IE7, searching was horrific. I hated the popup dialog that always showed up, but now in IE8, it has become a lot more like Firefox in that the search is integrated into the window.
Firefox 3.0 introduced a new type of address bar that searches as you type, and IE8 also introduced this. I have to say that IE8’s implementation is a little bit better because not only does it show me my web history, it also shows my feeds that I have saved, and also suggestions based on my web browsing history! +1 for IE!
Even the search bar got it’s own suggestions and history that can be shown!
I believe that IE 7 showed the world that Microsoft is giving IE the attention that it deserves. With IE 8, I believe that they have finally caught up with Firefox in terms of baseline browser ability. I still have to give the edge to Firefox for now as the better browser because of it’s extensions, but if Microsoft can make as dramatic of push from IE 7 to IE 8 when it goes from IE 8 to IE 9, wow, look out! I am excited to see the future of browsing the web!
Over the past few weeks while developing the next version of the Windows Live Installer, I have had discussions with other developers over different parts of the system. Each and every time we have some part of the software to discuss, I am always torn on how to describe what the software does. Should I say something like “The engine does X, Y, then Z” or should it be “Alice’s code does X, Y, then Z”.
I’m pretty sure that I have settled on “The Engine” instead of saying the developer who wrote the code. What does everyone out there think?
The Fashion Police Have Arrived
In an off the wall post for my blog – it appears that a small suburb of Chicago has banned baggy pants. In short, you cannot show more than 3” of underwear otherwise you get a $25 ticket.
I personally don’t wear my pants that baggy, but it does raise quite a few questions. What is considered underwear? Some people may wear gym shorts instead of underwear – are they allowed to show 3” of gym shorts? What about those that choose to go commando – can they show 3” of crack?
What about other fashions that “keep major retailers and economic development away”? I for sure wouldn’t want to open a business if people dressed like furries… or even Paris Hilton.
What about times of the year where it may even be encouraged to wear baggy pants, such as breakfast club or Halloween?
I think they have gone down a slippery slope which may get them into hot water.
It is currently a little over a month into my full time employment at Microsoft, and I am extremely pleased with everything that I am working on. For those that don’t know yet, I work on the installer for the Windows Live team.
I am going to go out on a limb and say that what I enjoy the most at Microsoft are the fringe benefits. This includes things such as a laid back atmosphere (I wear a t-shirt and jeans every day), free soft drinks (Coke AND Pepsi products, though I usually drink milk or juice), riding the connector, awesome club membership, and people who are much, much brighter than I am.
Another “benefit” is that I now get to be on the “inside” of everything that’s going on at Microsoft. I have already been given a demo of Windows 7 (WAY more than just a new touch screen) and I have daily builds of every Windows Live application available (Live Writer is sweet).
Although I can’t discuss details of everything that I work on, I can say that I learn so many new things every day. My first day at work, my mentor and boss gave me a set of books to get me familiar with what types of things I will work on.
Those are just the books that I got on my first day – more have arrived and more are on order. Needless to say, I probably don’t have an excuse for not being busy
.
My day-to-day work consists of Win32 (obviously)/C++/COM work, which before I started I had no experience. After digging my heels in for a month and wondering around a forest of code, I have made some clearings and know a few different pieces of a lot of code.
One aspect of working at Microsoft that I have enjoyed so far is that I have gotten to be in control of what I am doing, and people trust me to complete my assignments. This is obviously a scary feeling when I dig into a bug, or adding new functionality in an area of code I haven’t even looked at, but up to this point I have managed to not hose the build system too terribly.
About the only thing I am not enjoying are some of the tools we have to use. I have always been a Subversion or Mercurial guy, and the version control we use just doesn’t cut it. From looking at the commands, there are sometimes three commands that do the same thing, just slightly differently. Why create a whole new command when a flag would do? I am already thinking about making Mercurial manage Source Depot.
Each team around here is scrambling to finish the current milestone (most teams it’s this week with others next week), which has given me an opportunity to see a coding milestone from start to finish. The race has been interesting and has kept me on my toes. I look forward to my continuing adventures at Microsoft.
I am not a lawyer. Do not take this as legal advice.
It was brought to my attention that Roommates.com was sued for violating the Fair Housing Act (FHA). This was of extreme interest to me because of my similar roommate finder application, and how it may effect the future of it. The ruling concluded that Roommates.com was not immune by section 230 of the Communications Decency Act. Although a ruling of weather or not they are guilty of violating the FHA has not been decided, it has been decided that they are not immune.
Section 230 is what allows a website operator to not be held liable for content that they did not make. Without such a law, the Web 2.0 revolution would not exist. Imagine Reddit.com being sued for a comment someone makes, or Flickr being sued for a picture someone didn’t like.
Before there was section 230, there existed this marvelous new thing called “The Internet”. In order to access this mysterious place, most people had to use a dial up account through a provider. One of those providers happened to be called Prodigy. Prodigy had a message board for various purposes, and from time to time, a moderator would remove offensive posts. Because they were actively monitoring their service, they were put in the same territory as a newspaper publisher and thus legally responsible for all the content that they did not delete. Another provider, CompuServe, did not delete any information, and therefore was not liable for the postings of its users.
After reviewing this case, Congress sought to allow computer services the ability to edit user-generated content without becoming liable for all the content.
A service provider can be thought of as any interactive site that allows 3rd party user generated content, while a content provider is the actual person/company that generates the content.
Under 230c, a service provider is immune from content generated by a 3rd party provided that
So Roommates.com can be liable for the content of fake accounts that they create or a drop down menu, but not freely generated responses such as in someone’s description.
The entire reasoning behind section 230 is such that a service provider is immune from removal of user generated content, but not immune from the creation of content.
Roommates.com drew the short stick basically because it required users to disclose sensitive information to register and that there was no ability to hide the information. The Fair Housing Council claimed that, “[Roommates.com] created the questions and choice of answers, and designed its website registration process around them. Therefore, Roommate is undoubtedly the ‘information content provider’ for posting them on its website, or for forcing subscribers to answer them as a condition of using its services. as to the questions and can claim no immunity [under section 230].”
Seeing headlines like this can make a web developer extremely uneasy, especially for someone who is unfamiliar with the law, or who cannot afford a lawyer. Thankfully, in the ruling, they make it pretty clear as to how to be sure that you will be granted immunity under section 230c: “We got it right in Carafano, that ‘[u]nder § 230(c) . . . so long as a third party willingly provides the essential published content, the interactive service provider receives full immunity regardless of the specific editing or selection process.’”
So what I’m going to do in the future is make sure that a user must specifically allow the viewing of such information, or provide a “not specified” option.
* IANAL, get a lawyers opinion as this is not legal advice! *
Writing An Active Record Class
As the Active Record class has become increasingly popular due to it’s wild success in Ruby on Rails, it seems as though every framework has an implementation of it. It is no surprise that inside the covers of the MyEPICS framework lives an active record class that I had created. This class has evolved and changed over time, which I am going to share my experiences writing it. It is far from finished, but it has been quite a great learning experience along the way.
The MyEPICS 2.0 implementation contained one master database class (ME_DB) which contained generic CRUD functions, and each table contained its own class which would implement the specific CRUD functions for each table (ME_DBO). A sample way to read users with the name ‘bob’ would be the following:
$user=new ME_DBO_User();
$user->read(array('name'=>'bob'));
And to update a person’s last name to “foobar”, you would do the following:
$user->lastname="foobar";
$user->update();
About 90% of each of the ME_DBO classes were the same code, and there was even a script to create a DBO class given a SQL create statement. A major problem with this approach is that for every new table created, you needed to make sure you created a new ME_DBO file, and that the file really only contained such things as which columns were in the table and their default values. We would have about 2k lines of code between 30 files, of which only about 50 lines were different… YUCK! Over Christmas break, I decided that this was a major, major issue that needed to be worked out before MyEPICS 2.1.
With the 2.1 implementation, I took a step back and attempted to create two classes which would fix the pitfalls of the 2.0 implementation. What I ended up doing was using MBD2′s reverse engineering module in order to find out which fields were available and what their default values were. This reduced the need for a separate file for each table and removed about 1500 lines of code from the Active Record implementation. Now, instead of
$user=new ME_DBO_User();
You would do this instead
$user=ME_Db::factory('User');
This has the main database create a Dbo object with just the right properties that you need.
The only major gripe I have with the current implementation is that I don’t implement anything for relationships. If you need information from a relationship, then you have three options.
I mainly want to create something so that the relationship table is transparent. A lot of the time, your relationship table doesn’t have anything of value in it, and it only exists for a many to many relationship.
One such feature that I see in a lot of Active Record implementations is the ability to use functions named after SQL commands, such as:
$db=new Some_Active_Record_Class();
$db->select('firstname')->from('User')->where('id=5');
Mostly, I had disregarded this need in my Active Record implementation because it seemed like it was a lot of work for very little gain. Why would you need to allow such functionality when creating a simple sql statement would do?
Well, I think I had just stumbled upon the reason for its need.
I have a class for a user and contains information pertaining to the user such as first name, last name, e-mail address etc… It has some very useful functions such as getUserWithRole($role) and getPriviliges($user). What I need to be able to do, is extend this information through one of the MyEPICS modules. Such an example is in my Roommate Finder application, which extends the user to give them traits. The user module does not know about the Roommate Finder application, nor should it have to. Now, here’s the problem. What I need to be able to do, is return a result set of all the users’ traits, where the user has a certain role. I already have the code to return all users with a certain role in the Users module, now I just need to attach the trait information to the output of it.
I have come up with a few different solutions that would plug this hole, but not fix the problem, with most of them being some variation of typing up a single sql statement to get me the information. What I don’t want to do, is getUsersWithRole(), then iterate through all of theses picking out the traits for each individual user. This would result in at least one sql statement per user, which is highly innefficient.
I want to be able to execute this functionality in one sql query, without having to tightly couple the User module with the Roommate Finder module, and without duplicating functionality already existing in the User module.
What I have been thinking about that would solve this problem would end up having me creating something like the database command functions. Then, what the getUserWithRoel() function would do, is instead of returning the results, it would return a Dbo object with the sql already added. So that if getUsersWithRole() would normally result in some query like “select role from roles where role=?”, then it would now return an object that represents this statement. What this would allow me to do is chain these functions together, then only execute the query at the end. For example:
//fetch results in an array
$dbo=$userModule->withRole('Tenant')->join('Traits')->fetchArray();
This has several features which I haven’t implemented. Easy relationships, chaining of functions, and the sql commands.
Is it bad that I am never satisfied with what I already have, and always want to refactor to make it better?
Just now, I was about to download OpenOffice.org on my home computer to help with a bug report I made, and realized that I downloaded a 120MB file in about 70 seconds. Yes, I downloaded this puppy at nearly 2 megabytes per second!! Damn my connection is fast when my neighborhood is asleep!
Not only did I get a lot of work done tonight on my Roommate Finder application, but I also have managed to do a lot more in the past four hours.