My company (and product) has been nominated for a Crunchie in the "Best Design" category. I'm not surprised, since the product was cool enough to make me want to work there. However, it is nice to get recognition and positive feedback that other people feel the same way I do about it.
Anyway, if you like Cooliris and want to vote, you can vote for us here:
http://crunchies2008.techcrunch.com/votes/
And if you haven't tried Cooliris yet, please give it a whirl.
Practical coding tips, tricks, advice and anecdotes. Including, but not limited to: C++, C#, JavaScript, COM, OLE, Internet Explorer, Win32 and what-not.
Monday, December 29, 2008
Sunday, October 5, 2008
Cooliris 1.8.3 Released!
Cooliris 1.8.3
Last week we released 1.8.3 of Cooliris (formerly known as PicLens). You can download it here. In addition to Firefox 2 and 3 (Mac and Windows) we now support Safari 3 (Mac) and Internet Explorer 8 Beta 2 (Windows), though our IE8 Beta support is itself in Beta. In addition, we have lots of new features. 1.8.3 is one of the biggest releases we've had since we first debuted the 3D view.
More Shopping
A while ago we introduced support for searching Amazon in Cooliris. With 1.8.3 we now support ten different retailers such as eLuxury, Nordstrom, beauty.com, Macy's, Wal-mart and more, with more stores to be added. (Geeky aside: the client makes a request to our servers for some XML that describes all the stores that we support so we can add more stores without having to publish a new client.) In addition to more stores, we also now have improved UI for browsing the stores and sorting the results by price, popularity, etc.
Flash Support
In addition to various improvements we made to our A\V playback code (A\V sync issues, as well as better buffering logic for slow connections), this release debuts the project I've been hard at work on the last few months: Flash support. We now host the Flash plugin and can render SWF content directly in the wall. The upside for the user is they get the full YouTube player experience when browsing YouTube video, and we will be adding more and more interactive content over time. Right now we only support the Netscape Plugin version of Flash (NPSWF32.dll). So if you've installed Flash for Firefox or other Netscape derivatives, you'll get Flash support. If you only have the IE Active X plugin (flash9f.ocx, or related) you'll need to install the correct version which can be downloaded here.
There are lots of other improvements, fixes, optimizations, etc, such as better Keyboard Input support, but I can't remember all of them right now. I suggest you download the latest Cooliris and explore it for yourself.
Last week we released 1.8.3 of Cooliris (formerly known as PicLens). You can download it here. In addition to Firefox 2 and 3 (Mac and Windows) we now support Safari 3 (Mac) and Internet Explorer 8 Beta 2 (Windows), though our IE8 Beta support is itself in Beta. In addition, we have lots of new features. 1.8.3 is one of the biggest releases we've had since we first debuted the 3D view.
More Shopping
A while ago we introduced support for searching Amazon in Cooliris. With 1.8.3 we now support ten different retailers such as eLuxury, Nordstrom, beauty.com, Macy's, Wal-mart and more, with more stores to be added. (Geeky aside: the client makes a request to our servers for some XML that describes all the stores that we support so we can add more stores without having to publish a new client.) In addition to more stores, we also now have improved UI for browsing the stores and sorting the results by price, popularity, etc.
Flash Support
In addition to various improvements we made to our A\V playback code (A\V sync issues, as well as better buffering logic for slow connections), this release debuts the project I've been hard at work on the last few months: Flash support. We now host the Flash plugin and can render SWF content directly in the wall. The upside for the user is they get the full YouTube player experience when browsing YouTube video, and we will be adding more and more interactive content over time. Right now we only support the Netscape Plugin version of Flash (NPSWF32.dll). So if you've installed Flash for Firefox or other Netscape derivatives, you'll get Flash support. If you only have the IE Active X plugin (flash9f.ocx, or related) you'll need to install the correct version which can be downloaded here.
There are lots of other improvements, fixes, optimizations, etc, such as better Keyboard Input support, but I can't remember all of them right now. I suggest you download the latest Cooliris and explore it for yourself.
Saturday, September 6, 2008
Google Chrome: Better than Firefox, Internet Explorer
I installed Chrome when it came out last week and after only a day of using it I did the unthinkable: I made it my default browser. This is a big deal. I resisted making Firefox my default browser out of a very strong sense of loyalty to Internet Explorer. Chrome, however, is what I have always wanted a web browser to be: useful.
Let us start with the obvious things. The Tab UI is awesome. I have never liked the Firefox Tab UI. I think the IE Tab UI looks good, but they (we) never really nailed all the little quirks. Putting it up in the non-client area seems like such a no-brainer now. The UI is snappy, the animations are good looking, but subtle enough not to get in the way of using the product.

The MFU with thumbnails on the new-tab page is nice, though I wish it was more than just the top nine pages. I find it odd that I like it so much because I was really against doing something like this for IE (but I also never thought it could be made so fast in IE). I love the history-as-a-webpage feature. I am a little disappointed that I can not find a shortcut key to get to bookmarks. I don't want to take up screen space by having the bookmarks bar visible (though it is nice UI if you do turn it on). I know I can just type the name of the bookmark in the address bar, but I actually have long lists of bookmarks that I like to visit every day in a specific order. Instead I use CTRL+T to get a new tab then click the bookmark button.
I love the simplicity. We tried to make IE7 simple by getting rid of the menu bars and re-working things into the command bar. Chrome takes it all the way though.
The only UI I think looks wonky is the little pop-up in the bottom corner of the screen that appears when you hover over links. But I do like the little drop-down find box.
And of course, it would be nice if it worked with the ajax-y features of Facebook and Netflix.
Let us start with the obvious things. The Tab UI is awesome. I have never liked the Firefox Tab UI. I think the IE Tab UI looks good, but they (we) never really nailed all the little quirks. Putting it up in the non-client area seems like such a no-brainer now. The UI is snappy, the animations are good looking, but subtle enough not to get in the way of using the product.

The MFU with thumbnails on the new-tab page is nice, though I wish it was more than just the top nine pages. I find it odd that I like it so much because I was really against doing something like this for IE (but I also never thought it could be made so fast in IE). I love the history-as-a-webpage feature. I am a little disappointed that I can not find a shortcut key to get to bookmarks. I don't want to take up screen space by having the bookmarks bar visible (though it is nice UI if you do turn it on). I know I can just type the name of the bookmark in the address bar, but I actually have long lists of bookmarks that I like to visit every day in a specific order. Instead I use CTRL+T to get a new tab then click the bookmark button.
I love the simplicity. We tried to make IE7 simple by getting rid of the menu bars and re-working things into the command bar. Chrome takes it all the way though.
The only UI I think looks wonky is the little pop-up in the bottom corner of the screen that appears when you hover over links. But I do like the little drop-down find box.
And of course, it would be nice if it worked with the ajax-y features of Facebook and Netflix.
Wednesday, July 2, 2008
firefox 3: better than internet explorer 7
This is a difficult thing for me to admit, but I think Firefox 3 is better than Internet Explorer 7. Having worked on the IE team, I am the first one to defend it, apologize for it, and staunchly refuse to use anything else. So how could this have happened?
Well, the product I work on now is a plug-in for both Firefox and IE. Since I am primarily responsible for the IE version, and I do most of my development and debugging of our product when it is running inside IE. As a result I am forced to use Firefox to read e-mail and such while my IE install is in a bad state.
Firefox 2 was usable, but I liked IE much better still. A lot of really good UI work went into IE 7 around the Tab UI and optimizing away the old menu bar. Sure, it has its faults and quirks, but I still felt more at home in IE.
Now that Firefox 3 is out, I basically have been converted without even thinking about it. And that's the key: when I use Firefox 3, I don't notice that it isn't IE. The only time I notice it's Firefox is when it does something better than IE, like spell checking my edit boxes, or remembering the URLs from my last session.
It's the little things that matter.
When I use IE now, it feels slow and poorly put together. Firefox is snappy; the UI is more polished. They stole some ideas from IE (The Gold Bar) and made them better. They have some ideas of their own (disjoint search term matching in autocomplete) that are great, too.
And as a good friend of mine used to say, "if it ain't snappy, it's crappy."
So Firefox 3 sets a high bar for the IE team to meet. I sincerely hope they blow it away. I think it is way too early to judge the IE8 UI; I will just have to wait and see how it shapes up.
Well, the product I work on now is a plug-in for both Firefox and IE. Since I am primarily responsible for the IE version, and I do most of my development and debugging of our product when it is running inside IE. As a result I am forced to use Firefox to read e-mail and such while my IE install is in a bad state.
Firefox 2 was usable, but I liked IE much better still. A lot of really good UI work went into IE 7 around the Tab UI and optimizing away the old menu bar. Sure, it has its faults and quirks, but I still felt more at home in IE.
Now that Firefox 3 is out, I basically have been converted without even thinking about it. And that's the key: when I use Firefox 3, I don't notice that it isn't IE. The only time I notice it's Firefox is when it does something better than IE, like spell checking my edit boxes, or remembering the URLs from my last session.
It's the little things that matter.
When I use IE now, it feels slow and poorly put together. Firefox is snappy; the UI is more polished. They stole some ideas from IE (The Gold Bar) and made them better. They have some ideas of their own (disjoint search term matching in autocomplete) that are great, too.
And as a good friend of mine used to say, "if it ain't snappy, it's crappy."
So Firefox 3 sets a high bar for the IE team to meet. I sincerely hope they blow it away. I think it is way too early to judge the IE8 UI; I will just have to wait and see how it shapes up.
Sunday, June 22, 2008
your bho and your activex control can't be the same object
Frequently I see people writing a BHO, and at some point they realize they need to make a way for a webpage to call some function implemented by the BHO. The best way to do this is to expose an ActiveX control. The most common mistake I see is trying to make the ActiveX control be the same C++ object as the BHO.
This is wrong for several reasons.
It violates good coding practice.
The whole point of object level encapsulation is that each object does one thing. If your BHO is your ActiveX control, now it does two things. It may seem at first that you're really just adding a new method to your BHO, but you have to take into account all that goes along with being an ActiveX control. Implementing IDispatch, loading and dealing with the type library, implementing IObjectSafety, etc.
Your site will be wrong.
Pretty much every IE extension type--toolbands, BHOs, toolbar buttons, ActiveX controls--implements IObjectWithSite. If you make one object be two different types of extension, they will share IObjectWithSite implementations. And they all have a different IE object that is their site.
For example, a toolbar button's site will be an object in IE's toolbar code. A BHO's site is a completely different object in ieframe.dll that knows how to create and interact with a BHO. Explorer bars are sited to an object in ieframe.dll that hosts an explorer bar. And ActiveX controls are sited to an object in mshtml.dll that knows how to host ActiveX controls and implements several DOM interfaces (IHTMLElement, etc) as well.
So if you make your BHO and your ActiveX control the same object, the BHO will be instantiated first and IE will call your IObjectWithSite::SetSite() method with a pointer to one type of object. Then, when your ActiveX control is created later on, IE will call the IObjectWithSite::SetSite() method again, but this time with a different internal IE object's address. Now your BHO is broken. And debugging this sort of thing may take you a long time.
What we Learned Today
Every IE extension you implement must be it's own object, or bad things will start to happen.
This is wrong for several reasons.
It violates good coding practice.
The whole point of object level encapsulation is that each object does one thing. If your BHO is your ActiveX control, now it does two things. It may seem at first that you're really just adding a new method to your BHO, but you have to take into account all that goes along with being an ActiveX control. Implementing IDispatch, loading and dealing with the type library, implementing IObjectSafety, etc.
Your site will be wrong.
Pretty much every IE extension type--toolbands, BHOs, toolbar buttons, ActiveX controls--implements IObjectWithSite. If you make one object be two different types of extension, they will share IObjectWithSite implementations. And they all have a different IE object that is their site.
For example, a toolbar button's site will be an object in IE's toolbar code. A BHO's site is a completely different object in ieframe.dll that knows how to create and interact with a BHO. Explorer bars are sited to an object in ieframe.dll that hosts an explorer bar. And ActiveX controls are sited to an object in mshtml.dll that knows how to host ActiveX controls and implements several DOM interfaces (IHTMLElement, etc) as well.
So if you make your BHO and your ActiveX control the same object, the BHO will be instantiated first and IE will call your IObjectWithSite::SetSite() method with a pointer to one type of object. Then, when your ActiveX control is created later on, IE will call the IObjectWithSite::SetSite() method again, but this time with a different internal IE object's address. Now your BHO is broken. And debugging this sort of thing may take you a long time.
What we Learned Today
Every IE extension you implement must be it's own object, or bad things will start to happen.
Labels:
activex,
bho,
extensions,
internet explorer,
iobjectwithsite
Saturday, June 21, 2008
the internet explorer object cookbook
When you start writing Internet Explorer extensions, or dealing with the DOM and the Webbrowser control at all, you frequently find you have an object of type X and you need to get the corresponding object of type Y. There is a lot of myth and bad advice on the web surrounding how to do some of these things.
The "site" in all of the following refer to the IUnknown you are given by Internet Explorer when it calls your IObjectWithSite::SetSite() method.
IWebBrowser2 from site
1. QueryInterface() your site for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_STopLevelBrowser, IID_IServiceProvider.
3. QueryService() the top level IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.
IHTMLDocument2 from IWebBrowser2
1. Call IWebBrowser2::get_Document().
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.
IHTMLDocument2 from site
1. Follow steps for "IWebBrowser2 from site" above.
2. Follow steps for "IHTMLDocument2 from IWebBrowser2" above.
IWebBrowser2 from IHTMLDocument2
1. QueryInterface() the IHTMLDocument2 for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.
IHTMLDocument2 from IHTMLElement
1. Call IHTMLElement::get_Document();
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.
IHTMLDocument2 from HWND
1. Use the accessibility hack described at here.
The "site" in all of the following refer to the IUnknown you are given by Internet Explorer when it calls your IObjectWithSite::SetSite() method.
IWebBrowser2 from site
1. QueryInterface() your site for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_STopLevelBrowser, IID_IServiceProvider.
3. QueryService() the top level IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.
IHTMLDocument2 from IWebBrowser2
1. Call IWebBrowser2::get_Document().
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.
IHTMLDocument2 from site
1. Follow steps for "IWebBrowser2 from site" above.
2. Follow steps for "IHTMLDocument2 from IWebBrowser2" above.
IWebBrowser2 from IHTMLDocument2
1. QueryInterface() the IHTMLDocument2 for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.
IHTMLDocument2 from IHTMLElement
1. Call IHTMLElement::get_Document();
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.
IHTMLDocument2 from HWND
1. Use the accessibility hack described at here.
Monday, June 2, 2008
the freedom to choose includes the freedom to choose poorly
No, I am not going to talk about democrotics and our current and upcoming elected officials. I am going to talk about the consumer computer eco-system.
When I was doing IT consulting work during collage, there were a few major players in the PC world: Dell, HP, Compaq and Gateway. They all had their ups and downs with their products. Usually one would be good while the other was making boxes with problems, but then it would switch. Our job was to keep up on who was making good boxes at the time and sell them to our customers. However, we all knew the best machines were machines you built yourself. And we enjoyed building them. So when friends and family would ask me what computer they should buy, I would mention who I though was making a good model, but I would also offer to build them one that was better for cheaper.
When I worked at MSFT, we all had Dell workstations. I would say about 90% of all Windows development took place on Dell machines with Intel Processors. So when friends and family would ask for a computer recommendation, I would point them at Dell. Of course, I no longer had time to build them a machine, though I still built my own from scratch.
Now that I work on PicLens, I have to write code that supports Firefox, Internet Explorer and Safari on both Mac and Windows. We have subsystems that run on top of OpenGL, DirectX, and a software rendered that works in two different modes, depending on which we detect would give better support on a specific system.
Yet we still get a fair number of people who send in e-mail with reports of graphics issues. Some are minor glitches, some are major glitches that make the product unusable. A very small number are blue screens. We take all customer feedback seriously and follow up with them asking about their configuration, etc. Almost all of them have one thing in common: non-premium graphics cards, by which I mean a card that is not a high end ATI or NVidia card.
I am coming to the part where I get to the point.
These days, when friends and family ask me what computer they should get, I think I will start telling them to get a Mac.
Let me be clear, I still hate Macs. With a passion. I have to use one at work, and I remain unconverted. But what they do is take away the freedom to choose poorly.
Let me explain:
With a PC, you never know what you are going to get. And even people who build there own machines often make decisions based on price point, not quality. Not to mention people who build their own machines but do not really understand how hardware and software drivers work.
With a Mac, you always get good hardware. They all have Intel processors. They all have NVidia or ATI graphics cards, with drivers that are known to work. Sure, Microsoft can certify drivers, but they can not test them in every possible configuration of PC hardware. But Apple can test every configuration. Because they only have tens of possibilities instead of thousands.
Nothing has really changed since I was in IT consulting. The trade-offs are still the same: build your own, buy an OEM and roll the dice, or pay a bunch more for a Mac that you can only do so much with but at least it will work. All that has changed is my point of view.
As an idealistic youth, I wanted everyone to get the most from their computing experience. I wanted to educate them about the machines and the software. At Microsoft I just wanted them to leave me alone and figure it out for themselves. Now I just can not be bothered by it at all. Macs work. They stop you from shooting yourself in the foot. And hey, if people think it makes them look cool, then even better.
I will still be building my own machines. My house is all Asus all the time. It is amazing, but I have never had any problems with Asus video cards in Asus mother boards. I prefer NVidia (though it is not a logical or rational preference). I only buy Intel Processors(but that is a completely separate discussion) and Seagate hard drives (though I will accept Western Digital and I really wish there was a quality third player).
Everyone else should get a Mac. It makes my life easier in the short term, since I do not have to do any support. Though, I guess if everyone got a Mac I would have to do ALL my development on a Mac. And I would miss Visual Studio and NTSD.
So, I guess the moral of the story is when choosing a video card, choose wisely. Caveat emptor and all that. Or, spend more than $20 on a video card.
See also: Wired: Graphics Chips Gun for Supremacy in Silicon Showdown
When I was doing IT consulting work during collage, there were a few major players in the PC world: Dell, HP, Compaq and Gateway. They all had their ups and downs with their products. Usually one would be good while the other was making boxes with problems, but then it would switch. Our job was to keep up on who was making good boxes at the time and sell them to our customers. However, we all knew the best machines were machines you built yourself. And we enjoyed building them. So when friends and family would ask me what computer they should buy, I would mention who I though was making a good model, but I would also offer to build them one that was better for cheaper.
When I worked at MSFT, we all had Dell workstations. I would say about 90% of all Windows development took place on Dell machines with Intel Processors. So when friends and family would ask for a computer recommendation, I would point them at Dell. Of course, I no longer had time to build them a machine, though I still built my own from scratch.
Now that I work on PicLens, I have to write code that supports Firefox, Internet Explorer and Safari on both Mac and Windows. We have subsystems that run on top of OpenGL, DirectX, and a software rendered that works in two different modes, depending on which we detect would give better support on a specific system.
Yet we still get a fair number of people who send in e-mail with reports of graphics issues. Some are minor glitches, some are major glitches that make the product unusable. A very small number are blue screens. We take all customer feedback seriously and follow up with them asking about their configuration, etc. Almost all of them have one thing in common: non-premium graphics cards, by which I mean a card that is not a high end ATI or NVidia card.
I am coming to the part where I get to the point.
These days, when friends and family ask me what computer they should get, I think I will start telling them to get a Mac.
Let me be clear, I still hate Macs. With a passion. I have to use one at work, and I remain unconverted. But what they do is take away the freedom to choose poorly.
Let me explain:
With a PC, you never know what you are going to get. And even people who build there own machines often make decisions based on price point, not quality. Not to mention people who build their own machines but do not really understand how hardware and software drivers work.
With a Mac, you always get good hardware. They all have Intel processors. They all have NVidia or ATI graphics cards, with drivers that are known to work. Sure, Microsoft can certify drivers, but they can not test them in every possible configuration of PC hardware. But Apple can test every configuration. Because they only have tens of possibilities instead of thousands.
Nothing has really changed since I was in IT consulting. The trade-offs are still the same: build your own, buy an OEM and roll the dice, or pay a bunch more for a Mac that you can only do so much with but at least it will work. All that has changed is my point of view.
As an idealistic youth, I wanted everyone to get the most from their computing experience. I wanted to educate them about the machines and the software. At Microsoft I just wanted them to leave me alone and figure it out for themselves. Now I just can not be bothered by it at all. Macs work. They stop you from shooting yourself in the foot. And hey, if people think it makes them look cool, then even better.
I will still be building my own machines. My house is all Asus all the time. It is amazing, but I have never had any problems with Asus video cards in Asus mother boards. I prefer NVidia (though it is not a logical or rational preference). I only buy Intel Processors(but that is a completely separate discussion) and Seagate hard drives (though I will accept Western Digital and I really wish there was a quality third player).
Everyone else should get a Mac. It makes my life easier in the short term, since I do not have to do any support. Though, I guess if everyone got a Mac I would have to do ALL my development on a Mac. And I would miss Visual Studio and NTSD.
So, I guess the moral of the story is when choosing a video card, choose wisely. Caveat emptor and all that. Or, spend more than $20 on a video card.
See also: Wired: Graphics Chips Gun for Supremacy in Silicon Showdown
Subscribe to:
Posts (Atom)