Avishkar Autar · Oct 8 2008 · Random
I stumbled across an interesting project on reddit yesterday, it’s called Firelight and it’s basically a system that utilizes Javascript + SVG + XAML. It’s still in its infancy and I’m pretty iffy on XAML in general, but it’s a pretty cool idea nonetheless.
Avishkar Autar · Oct 5 2008 · Random
Weather Passions,
A 100% free social networking & online dating site specifically for singles with a passion for weather.
… but really, who isn’t turned on by a high pressure system coming in from the west?
Avishkar Autar · Oct 1 2008 · Uncategorized
I stumbled across an old article on CNN Money on how small businesses can attract new customers. I wasn’t that interested in the article and glossed over most of the points, but one did catch my attention:
Emphasize your product’s benefits, not just its features. Say you are selling a teapot with a spill-proof spout. Rather than simply mention the spout’s spill-proof shape, focus on the problems it will prevent: burned hands, ruined suits, etc.
This seemed interesting because in the software world features seem to be evangelized over everything else. However, after digging a bit, I realized the issue is a bit more complicated. In general, what I discovered was that when features are enumerated, they’re usually accompanied by or mixed-in with product benefits, and it’s not always clear-cut that favoring one method over the other is the best approach when it comes to attracting users (in general, even for free products, I don’t think it’s too much of a stretch to replace the term “customers” with “users” for something like this, as the bottom line is still getting people to use your product).
Case 1: Firefox (features then elaboration with benefits)
The firefox features page shows a simple case of what I’m describing. Features are presented as headers and below each is a concise description of how said feature benefits the end-user. e.g.,
One-Click Bookmarking
Bookmark, search and organize Web sites quickly and easily.
Nice and simple, feature (one-click bookmarking) followed by benefit (bookmark, search and organize web sites quickly and easily.)
Case 2: Blogger (mishmash of features and benefits)
The blogger features page is a bit more of a mishmash. Sometimes benefits are listed as headers with an elaboration of features below it, e.g.
Publishing your voice is easy and free
…In a matter of minutes you can start posting text, photos, videos, and more to your blog…
The header details a benefit of using blogger (it’s easy and free) which the description elaborates and lists a few features (ability to post text, photos, videos, etc.).
In other cases, it’s vice-versa,
New post notifications
Your readers can choose to subscribe to your blog’s feeds, so they’re notified whenever you publish a new blog post…
Like the Firefox feature page, it’s feature (new post notifications) followed by benefit (readers notified when now posts are published).
Case 3: Picasa (verb then elaboration of feature and/or benefit)
Picasa features is interesting in that it’s headers are verbs describing actions you can virtually perform using the software (organize, edit, create, share). Following the header is a very concise description of features (edit: eliminate scratches & blemishes, fix red-eye, crop, … ) or a benefit (organize: manage your photos in one place, and find photos you forgot you had). This is unbelievably simple yet still seems to accomplish its goal of evangelizing the product. However, this is photo management software, so it’s worth noting that the software itself is a fairly simple mechanism.
There’s a lot more feature pages that can be looked at, but I haven’t found anything else too interesting. Apple does the same as what’s described in the Firefox case; features then elaboration with benefits (e.g. feature page for Xsan). Microsoft is a beast and lists features and benefits in a variety of ways for different products and in different ways. Narrowing the focus and just looking at Office, Microsoft seems to have a product overview for each product (e.g. Word 2007 product overview) which describes benefits and features in the same mishmash way described in the blogger case. There’s also a “Top 10 reasons to try” (e.g. Word 2007 Top 10 page) page which seems to be similar to the product overview, but more concise by listing only 10 benefits or features.
One issue with all the cases described is that the target is the new, uninitiated user. Users who are upgrading probably don’t want to read a ton of information about benefits and features they’re already aware of, so a list for upgrading users may be something important as well.
What’s best? worst? I don’t know. Overall, I like the Picasa case for it’s simplicity. Its features/benefits list is very short and uses only a few sentences, but within that space it manages to describe exactly why that piece of software should or might matter to a potential user and why they should use it.
Avishkar Autar · Sep 24 2008 · Graphics and Rendering
Every once in a while I’ll test some piece of code and encounter a bug or some unexpected behavior that produces something weird, peculiar, or just something pretty damn cool. Here’s a perfect example,
This is from some vectorization code I’m working on. Just for the hell of it, I decided to run the output image (the one with the green pixels, which represents vertices of a polygon) through the vectorization algorithm again. The subsequent images show what happened as I kept running the vectorization algorithm on the output, in effect creating a feedback loop. (The colors that are present in the subsequent images are a result of an earlier stage in the vectorization process, the output of which is no longer adequately processed, resulting in the pattern that’s visible).
Avishkar Autar · Sep 23 2008 · Uncategorized
I’ve finally made the jump away from blogger and I’m now running a custom themed, wordpress blog on my server. I made the change for a number of reasons, among them the fact that a self-hosted wordpress blog puts all content on my server (as opposed to blogger’s ftp publishing, which leaves comments and profile information on blogger servers), wordpress has the ability to search through posts, and I wanted a new, wider design.
I’m fairly happy with the move, so far my only gripe with wordpress has been it’s auto-paragraphing feature, which screwed up my code boxes (<code>…</code>). I finally just gave up trying to fight with it and installed wpautop, a plugin which disables it. Unfortunately, this also means that I have to manually do the html markup for my posts and I’m not too thrilled about having to do this for all of my old posts.
The design is still a work-in-progress as there are a few rough edges, but I’ll be making these improvements gradually. Overall, I was aiming for a simple, clean but non-generic look, and I’m pretty happy with the results. So, goodbye to blogger and goodbye to the old blog (or it’s template at least, as all the posts are still here).
Avishkar Autar · Sep 1 2008 · Uncategorized
This is a minor update to Rtf2Html (my lightweight rtf to html converter). This version will detect tabs within the RTF text and convert any tab characters to 4 spaces in the HTML output.
Avishkar Autar · Aug 29 2008 · Uncategorized
Small website for Universal Construction Corp.,
Wasn’t crazy about doing a fixed-height design, but it was by request of the client. Given a fixed-height requirement, a bottom menu seemed like an cool idea; it’s fine if viewing the site at or above the desired resolution (1024×768), but at a lower resolution navigation becomes annoying as your forced to scroll down to get to the menu. If doing another fixed-height site, I’d likely avoid a bottom menu.
Avishkar Autar · Aug 19 2008 · Networking
Note: Everything below relates to Windows XP Professional with Simple File Sharing turned off.
One of the simple things that can be done to prevent unwanted peer-to-peer network access to data on Windows is to disable the Guest account (you can alternatively give permissions to specific users or groups, but for my situation this is a hassle as I, generally, don’t need the level of granularity). By some mechanism unknown to me (perhaps malware or a recent virus), the guest account on my desktop was turned on. With the guest account on and shared folders allowing everyone access, any machine connected to the network was able to seamlessly login and access anything in the shared folders. The situation bugged me for quite a while as I didn’t realize the active guest account was the culprit because from looking at the User Accounts extension in Control Panel, I saw the following:

Unfortunately, this does not mean the account is actually disabled, it simply means it doesn’t appear on XP’s welcome screen. I finally took at look at the Administrative Tools >> Computer Management extension, then navigated to Local Users and Groups >> Users, and saw that the guest account was enabled. Disabling it here (right-click on Guest >> Properties >> check the “Account is disabled” checkbox), actually disabled the account and prevented automatic authentication as Guest for incoming peer-to-peer connections.
As you can probably guess my real annoyance here is the discrepancy between what appears in the User Account extension vs. the actual state of the account.
Avishkar Autar · Jul 31 2008 · Web Technologies
This post is about issues that pop up after you’ve got WebKit compiled and can get an application up and running within initialization errors.
(fyi, these are issues I’ve had on Win32. Things may be different on other platforms)
Issue 1: Safari theme doesn’t work, causes crash
If, like me, you’ve just copied the other necessary DLLs needed by WebKit from your Safari directory, SafariTheme.dll will cause you trouble (crash) unless you copy over the \SafariTheme.resources folder as well.
Note that WebKit will work fine without the Safari theme. Simply, get rid of the SafariTheme.dll file and a default theme will be used (it’s ugly, but it’s functional). Also, note that I’m not sure what the copyrights/license is for the Safari theme, there may be restrictions on using and/or distributing it.
Issue 2: “localized string not found” in context menus
Go to folder where you have the WebKit source. Navigate to WebKit\win. There you’ll find the \WebKit.resources folder, copy it to the folder with your WebKit DLL. Next, copy \English.lproj into the copied \WebKit.resources folder.
So, in the directory with your WebKit DLL, you should have:
\WebKit.resources
\WebKit.resources\English.lproj
Issue 3: loadURL() does nothing
If your using the WinLauncher application as guide, you’ll notice the loadURL() function doesn’t seem to work. This is because the timeout interval passed to the initWithURL() member is 0. A value of 60 (seconds?) seems to work well.
request->initWithURL(urlBStr, WebURLRequestUseProtocolCachePolicy, 60);
That’s it for now. In the next few days, I’ll post how to wrap WebKit and embed it within a WinForms application; screenshot below.
Avishkar Autar · Jul 23 2008 · Win32 Platform
Playing around with WebKit a bit and stumbled across the headaches of working with a COM DLL. WebKit uses COM interfaces, so an application using a WebKit DLL must register the DLL. COM DLL registration is system-wide (i.e. all calls will be directed to a single DLL file), and this creates a problem if an application wants to use a DLL of a different version or a custom one (assuming renaming all the interfaces is not a viable option).
A simple solution to this seems to be to register and unregister the DLL programmatically. By doing so, any existing (or non-existent) registration is ignored and the exact DLL file the application needs is registered and used. The registration is still system-wide, but if other applications follow the same policy there doesn’t seem to be a problem. For applications that don’t follow this policy, it seems their calls will go to the last DLL registered.
(This is just from my own investigation and I really don’t know a whole lot about COM stuff. If anything mentioned is incorrect, please correct me.)
How to register and unregister COM DLLs can be found here. This is a bit convoluted. I actually just followed the steps listed in the second post of this thread on the MSDN forums to write my code.
To register:
HMODULE webKitMod = ::LoadLibrary(L"WebKit.dll");
FARPROC regFunc = ::GetProcAddress(webKitMod, "DllRegisterServer");
if(regFunc != NULL)
{
HRESULT regRet = regFunc();
if(regRet != S_OK)
{
// report error
}
}
else
{
// report error
}
::FreeLibrary(webKitMod);
To UnRegister:
HMODULE webKitMod = ::LoadLibrary(L"WebKit.dll");
FARPROC unRegFunc = ::GetProcAddress(webKitMod, "DllUnregisterServer");
if(unRegFunc != NULL)
{
HRESULT unRegRet = unRegFunc();
if(unRegRet != S_OK)
{
// report error
}
}
else
{
// report error
}
::FreeLibrary(webKitMod);