VPSLink: Finally, VPS Priced For 2009

by Jon Davis 30. December 2008 15:00

A little over a year ago I spent weeks trying to find the most affordable way to host cachefile.net (now defunct) among a few other things in a reliable manner. I didn't want my site shared with a bunch of other sites, and I certainly did not want plain-vanilla Apache/mySQL/PHP. I wanted my very own instance of Linux on which I could feel free to do anything--rig Apache to my liking, host my e-mail, install an XMPP server, you name it, anything. I also ended up hosting this blog--jondavis.net--on my home PC with the Linux instance acting as a reverse proxy so as to bypass my cable modem provider's blockage of port 80.

The best deal I could find was ServerPronto. These guys seemed to have adequate bandwidth and gave me solid specs for the dollar, for what they said was a dedicated physical server. 

But even that was priced out of my range, because up to this point I have not been trying to make a profit / living off of my Linux instance, although at this point I think I might as well. I was paying out about $180 per 3 months, and that gets expensive especially in this economy.

I also found that while BlueHost has proven adequate for my own e-mail, and I'm REALLY not happy with the ASP.NET web host offerings out there since none of them support IIS 7 module installations, I could probably be just fine hosting everything on my BlueHost account and on my home PC through my cable modem, if only I could retain that reverse proxy out there, somewhere, without spending $180 every three months.

Last night I went shopping around again to see if there were any other solutions for me, when, lo and behold, I came across a VPS (Virtual Private Server -- Xen virtual machine hosting, basically) host that came at the same price as a typical shared web host: VPSLink. For less than the price I was paying every three months before, now I can get two years of my own Linux instance. Indeed, if you're reading this right now (and of course you are, as am I posting it), that's my new VPSLink account working for me.

Now, granted, I lose out on what I originally sought after: very high availability and scalability. I am back on a shared host, after all, and I have little doubt it's gonna get crowded over here. But, as I said, cachefile.net is now defunct, and really this only serves for reverse proxying to my cable modem and for lightweight LAMP hosting; if I ever really need high availability I'll also need a good reason, and if it's for profit then I'll be able to afford something more. But I get everything else here: my own CentOS instance on the 'net really, really cheap.

---

UPDATE: Of course, upgrades to Apache when migrating from FC6 to CentOS 5.2 would force me to add these directives to my httpd.conf:

SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1 

.. or else I get proxy errors:

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET.

Still not sure if I have rid myself of them entirely yet...

Currently rated 3.0 by 1 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

Linux | Servers and Services

Internet Explorer cannot open .htm/.html files

by Jon Davis 19. December 2008 12:46

I have not validated the following on any other machine besides my own, but it is happening to me now and I'm absolutely fuming mad by the endless hell that Internet Explorer just can't stop being.

In Windows XP SP3, if the .htm file extension has been previously disassociated with an application, using the Windows shell to associate it to Internet Explorer by right-clicking on the file and choosing "Open With..." and then choosing Internet Explorer, will cause Internet Explorer to open it as a text file. It will render the HTML source as text.

Doing the same to an .html file rather than an .htm file will cause Internet Explorer to flicker open for a split, barely noticeable second, then quit. Of course, associating it with Firefox works fine.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

How to ruin a perfectly good browsing session...

by Jon Davis 17. December 2008 23:36

Ever had this happen to you while you were trying to debug? You're trying to debug your Javascript code, and then you accidentally set yourself up with an infinite alert loop, and ....

, but be prepared to hit Ctrl-Alt-Del, choose Task Manager, and kill your browser.

*sigh* The browser vendors really need to find another way to make these alerts show up, such that you can cancel script.

 

Update: Oooh, nice, Chrome gave us a good one ..
chrome_stop_alert

Sadly, checking it also causes this blog page to not refresh, the whole browser becomes unstable. Click on the <-- (Back) button to make it behave normal again.

image

Opera plays nice too.

Internet Explorer, Firefox, and Safari all FAIL.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

ASP Classic: Simulating ASPCache

by Jon Davis 13. December 2008 06:36

This is for you folks who, like me, have found themselves having to deal with legacy ASP Classic code.

At my workplace, there are mountains of ASP files that make use of a component called ASPCache which when Googled looks like it comes from here: http://www.webgecko.com/products/aspcache/

This component appears in the global.asa like so:

<object runat="server" scope="application" id="Cache"
  progid="ASPCache" viewastext></object>	

Then, references to Cache appear throughout the code:

bAdded=Cache.Add(CacheKey, value, 60000) ' Cache for 1 minute	

.. and ..

myvar=Cache(cachekey)	

The code runs on two servers: a production server and a dev server. But for mainenance and new projects, I prefer to work locally. Since I did not have the ASPCache component, the entire site was crippled by the presence of this ASPCache dependency when I attempted to execute the web app from within my local instance of Windows XP + IIS 5.

Ignoring The Cache

The legacy code was already written in such a way that if ASPCache failed to take or to return a value it would work around it; the problem is that it didn't know how to live without the presence of the ASPCache dependency.

So the first thing I did to work around the problem was to just cripple the ASPCache dependency in global.asa.

REM #### obXXject runat="server" scope="application" id="Cache"
  progid="ASPCache" viewastext /obXXject	
	

.. and then wrap ASPCache invocations with error-ignoring handlers ..

On Error Resume Next ' no cache
    bAdded=Cache.Add(CacheKey, value, 60000) ' Cache for 1 minute
On Error Goto 0

..

On Error Resume Next
    myvar=Cache(cachekey)
On Error Goto 0

This worked fine for me locally; at this point I was able to execute my code.

But there were several files I had to apply this to, and the next problem is that there are about twenty different web sites with much of this same duplicate source code.

Worse--much worse--I had essentially killed off the ASPCache dependency from global.asa. I could never check in / commit this file back to Subversion without breaking the production codebase, unless I reversed these changes. It was frankly too easy to accidentally commit the entire site with all my changes including global.asa's removal of the dependency, and I didn't want this to happen.

So what I've decided to do was to reproduce the ASPCache API with my own COM object using the above-described interfaces.

Creating My Own ASPCache

To reproduce ASPCache, the requirements per the above samples are really quite simple:

  1. The <object> tag tells me that it needs a ProgID of "ASPCache". ProgIDs are to COM what DNS host names are to the Internet; they are mappings to CLSIDs (class IDs), which are GUIDs, like DNS host names map to IP addresses. The CLSIDs are registry keys that map back to a COM DLL, such as ASPCache's DLL.
  2. The COM interface needs to have a default function or property that returns an item when being supplied a key. Default properties / functions are an exclusive feature of VB6--they are not available in VB.NET, VBScript, or most other languages, but the behavior is not unlike an indexer in .NET that wraps a particular hashtable or function.
  3. The COM interface also needs an "Add" function that takes a key, the value to be cached, and a value indicating, in milliseconds, how long the item should remain in the cache.

This blog entry took me about 10x more time to document than it took me to create the ASPCache equivalent detailed herein; I love blogging. ;)

To produce this component, I fired up Visual Basic 6. Visual Basic 6 is still available for download on MSDN as far as I know, as it's still the only way to easily produce first-class COM objects without resorting to .NET CCW's, C++, or Delphi. I spent a few years in my past, back in the 90's and very early 2000's, working with VB 5/6 to create COM objects and Windows applications, so this was not foreign territory for me. At this point I'll walk through the steps as a tutorial.

  1. In the Visual Basic 6 New Project dialog, choose "ActiveX DLL".
    vb6_activex_dll_project
     
  2. The project that gets created is called "Project1", with a single item in the project called "Class1". Rename "Class1" to "ASPCache" using the Properties tool window on the right side of the screen.
  3. The project needs to be renamed as well. I changed it to "VirtualASPCache".

      
  4. In the class formerly named "Class1" (now "ASPCache"), I used the following code:

    Dim cacheCol As New Collection
    Dim cacheTmr As New Collection
    Dim m_flushenabled As Boolean
    Dim m_flushtimeout As Long
    Dim m_flushinterval As Long
    
    Public Property Get Item(key) As Variant
        Dim tmr
        On Error Resume Next
            tmr = cacheTmr(key)
        On Error GoTo 0
        If Not IsEmpty(tmr) And Not IsNull(tmr) Then
            If tmr < Now Then
                cacheTmr.Remove key
                cacheCol.Remove key
            End If
        End If
        On Error Resume Next
        Item = cacheCol.Item(key)
    End Property
    
    Public Property Let Item(key, ByVal vNewValue As Variant)
        cacheCol(key) = vNewValue
    End Property
    
    Public Function Add(key, value, Optional time_period As Long = 0) As Boolean
        Dim tmr
        If time_period = 0 Then time_period = 60000 * 60 * 30 ' 30 minutes
        tmr = DateAdd("s", (time_period / 1000), Now)
        On Error Resume Next
            cacheCol.Add value, key
            If Err.Number <> 0 Then
                On Error GoTo 0
                Add = False
                cacheCol.Remove key
                cacheCol.Add value, key
                On Error Resume Next
                    cacheTmr.Remove key
                On Error GoTo 0
                cacheTmr.Add tmr, key
                Exit Function
            End If
        On Error GoTo 0
        cacheTmr.Add tmr, key
        Add = True
    End Function
    
    ' ignored
    Public Property Get FlushEnabled() As Boolean
        FlushEnabled = m_flushenabled
    End Property
    
    ' ignored
    Public Property Let FlushEnabled(ByVal enabled As Boolean)
        m_flushenabled = enabled
    End Property
    
    ' ignored
    Public Property Get FlushTimeout() As Long
        FlushTimeout = m_flushtimeout
    End Property
    
    ' ignored
    Public Property Let FlushTimeout(ByVal Timeout As Long)
        m_flushtimeout = Timeout
    End Property
    
    ' ignored
    Public Property Get FlushInterval() As Long
        FlushInterval = m_flushinterval
    End Property
    
    ' ignored
    Public Property Let FlushInterval(ByVal Timeout As Long)
        m_flushinterval = Timeout
    End Property
    
    
    
    
  5. Make the Item property the default property. To do this, hit F2 to open up the Object Browser. Then at the top left drop-down menu, filter by your project. Select ASPCache, then on the right find Item. Right-click on it, choose Properties, and then expand the Advanced view. On the left is a Procedure ID drop-down where you can specify "Default".
    vb6_default_property
  6. Save the project (File -> Save Project)
  7. Make the DLL (File -> Make VirtualASPCache.dll)
  8. In a command prompt (Windows Start menu -> Run... -> cmd.exe) navigate to your project ("cd \myprojects\virtualaspcache", etc) and register the DLL to the COM registry:
    regsvr32 VirtualASPCache.dll
  9. Almost there. Now we need to change the ProgId. VB6 uses the following convention for ProgID: "{ProjectName}.{ClassName}". So for us that would be "VirtualASPCache.ASPCache". So, pull up Registry Editor (Windows Start menu -> Run... -> regedit.exe). Under HKEY_CLASSES_ROOT, find a key (keys look like directories on the left; values are on the right) called "VirtualASPCache.ASPCache".


    Rename "VirtualASPCache.ASPCache" to "ASPCache".  

Restoring the original code in global.asa, not only am I able to retain the dependency reference, the cache API actually works, it is not merely walked over. So now I can retain all the original ASP code as-is, and it should all function pretty much the same.

Download: VirtualASPCache.zip (8.31 kb)

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

Web Development

jQuery Failed Me?

by Jon Davis 10. December 2008 19:52

I had a painful and uncomfortable epiphany today, one that should not go unnoticed. In building up a form consisting of about 30 fields, I processed all of the "submitted values restoration databinding"--that is, re-populating the fields' values after submitting the form because the form failed validation--in script, using jQuery, like so:

(Yes, this is VBScript in ASP Classic:)

	<% For Each field In MyDictionary %>
	$("#<%=field%>").val("<%=Request(field)%>");<%
	Next %>
	

This was a really simple notion, to data-bind all my fields with just three lines of code. And it worked. It worked great. Except for one problem.

With thirty fields, plus code to add highlighting and such, it took jQuery, in IE7 (yes that monstrous piece of doo-doo, Internet Explorer) the browser kept locking up for five seconds every time the page was refreshed (that is, every time the form was posted locally with invalid field values), while it waited for jQuery to find each of these fields and populate their values. Now, I'm sure I could go back and do some optimizations; for example, I could have done the loop in reverse and limited my jQuery selector to a single search, something like:

	var fieldMap = {};
	<% For Each field In MyDictionary %>
	fieldMap["<%=field%>"]="<%=Request(field)%>";<%
	Next %>
	$("input").each(function() {
$(this).val(fieldMap[$(this).attr("name")]); });

But besides the fact that my code just grew, there was another problem with the jQuery approach. Some people turn script off altogether. Ultimately I had to do what I tried so hard not to do, which was this junky markup:

	<input type="checkbox" <%If Request("foobar") = "ABC" Then %>
	checked="checked"<% End If %> name="foobar" value="ABC" />
	<input type="text" value="<%=Request("acme")%>" name="acme" /> 
	

Now all of a sudden I had messy, difficult-to-maintain code. Any time you put implementation detail on the detail, such as here having field instance named data binding, you have messy code; I prefer to go abstract as much as possible.

But I didn't see any way around this.

Generally, people don't run into this problem. They typically settle for something like Web Forms, which imposes View State and ultimately suffers from similar performance issues in different ways.

I was lucky. I was doing my ASP Classic coding in Visual Studio 2008, which I might add would be a GREAT ASP Classic IDE, except for one not-so-small problem: VS crashes every time you quit the ASP Classic debugger. :(  Anyway, Visual Studio gave me the RegEx Find-and-Replce tool, which I spent no time thinking about; as soon as I realized I had to manually inject my binding code into the HTML markup, I started doing things like this:

        Find: name\=:q
Replace With: name\=\1 value\=\"\<\%\=Request(\1)\%\>\"

I did have a lot of bad runs for the several changes I had to make (thank Microsoft for Undo->Replace All), still in the end I saved a few minutes.

The end result was instantaneous refresh. Zero delay.

But after all that, I got up and went for a nature break (too much information?) and started asking myself, wait, what just happened? Till now I've started to sing the praises of jQuery about how wonderful it is and how it is our panacea to all the world's problems and ultimately hunger and disease in Zimbabwe and elsewhere in the world will end after we all adopt jQuery.

Now I'm coming to find that DOM traversing, in general, is not something that should be done on the client for such core operations as data-binding. This had me thinking again about Aptana Jaxer. Jaxer gives you jQuery (actually, browser-compatible Javascript in general) on the server by offering a Mozilla-based browser DOM on the server and spitting out to the client the resulting DOM markup in its modified state. But would this be any more performant?

It would be more performant than IE7 at least. Mozilla's JavaScript runtime is a lot faster than IE's Javascript runtime. But it's still client-side performance before the client ever receives anything. If nothing else, it would at least be perceived performance improvement because you don't see a web page build up all around you and then you have to wait for five seconds while the browser freezes.

Even so, Jaxer is not available in the workplace, nor should I ever expect it in my case.

I ended the day realizing that my curiosity of the notion of migrating all templating and forms and view logic off the server and onto the client might not be as desirable as I thought it would be. This could be a problem, too, for ASP.NET AJAX 4.0, which intends to migrate data binding to the client (something I celebrated when I found out about it).

Strange Fun In The Land Of Legacies

by Jon Davis 10. December 2008 18:41

That was a fun title. Anyway...

At my job in addition to .NET bits I have been dutifully tasked with ongoing maintenance and updates projects for systems still running ASP Classic. That is, raw VBScript, with no MTS, no VB6 code reuse, just pure vanilla VBScript and ADO Classic. Mind you, I *can* use jQuery and the system does use SQL Server 2005. But I never dreamed I would ever say this--not in the eight years or so it's been since I abandoned ASP Classic and adopted Java and then .NET. Gosh, I'm still scratching my head wondering how it happened...

.. but I'm actually enjoying this. I'm enjoying VBScript. You heard me say it, right here. That lame language that has been given all kinds of names (a three-letter one that starts with a 'g' comes to mind), I am actually having fun with it.

I think I know why, too. After spending several days working with VBScript, I go back to C# or even JavaScript and realize that the transition from VBScript to C# is like the transition from C# to C++: in exchange for raw power, you have to do a lot more futzing with syntax to accomplish something.

In VBScript, a lot of time is saved by relying on variants and dynamic typing as such. Mind you, I'm fully aware of why the Variant was thrown out in .NET and how it is so evil in computer science. The fact that I don't have typed objects makes me pull my hair out more than it gives me pleasure. But this is script, and it almost forces me to be productive by refusing to get too formal. There's a difference between software and script, and it has nothing to do with technology.

I used to argue that what makes a "script" was that it isn't script if it doesn't run straight from the source code, which I think is close. Microsoft's definition of "script", after abandoning the Active Scripting runtime, was dynamic typing (which I think is also close, but also wrong). I've come to realize another differentiater: business use. A script is a piece of code that just gets the local, immediate, and temporary job done. A form is a classic scenario. A visitor to a web page fills out a form, the data gets collected to a database, the user is told "thanks, we'll get back to you, now go away", and a whole lot of nothing else happens in the short term. And in most business cases, you only have a tiny handful of people (like, three, at the most) filling out this form at the same time, so you don't need to worry a huge amount about performance. (If this was a page that was getting pounded on, you can scale up or scale out, hardware-wise. I am not solely impressed with people who go nuts about optimizing their systems for hundreds of thousands of hits per day but only keep two web servers up. Ten web servers on a farm and it's still slow, okay, then there's a problem with the code, or maybe the networking, otherwise, I mean, seriously. Mosso.com FTW.) 

VBScript is very much a command-oriented language. Parentheses for function invocations are discouraged to make a more "command-like" syntax of "mow lawn" rather than "mow(lawn)". This doesn't account for or mean much, but after abandoning C# for a short period of a few days and spending a few days in VBScript I take a step back and realize how nice it is to be terse in my command-orientation; no futzing with parentheses and semicolons and brackets.

In my opinion, the best development language is the one that a) gets the job done reliably and effectively, b) is most productive for the developer (effort+time=productivity loss), and c) is most maintainable. VBScript is not the most stable language but it does get the job done, and on simple forms pages it is a great language. It is VERY productive, albeit it depends on what you're doing with it as there's no templating or scaffolding in ASP Classic, but I still admire ADO Classic at times. And last, on the maintainability side .... *cough* well .. no. It's not very maintainable. On the other hand, it all really depends on how you write your old code. Componentizing your code in #include's and using VBScript classes and functions where appropriate, one can produce maintainable code. I think where it gets messy is in the details. I still, always have, and always will, hate "Then", as in "If...Then". What a waste of four letters, two if you were to replace it with parentheses in other languages. And when you're using it inline with markup, you also can't leave out the "End If". It's usually not an issue, until you do something like ...

	<input type="radio" <% If Request("mySel")="ABC" Then%> checked="checked"<%End If%> 
	name="mySel" id="mySel_dah" value="ABC" />	
	

Ugly. This is why ASP.NET Web Forms was invented, to bury that logic into the ViewState. Personally, though, I think the trade-off isn't there, and in fact, kudos to my boss, who went around asking what we thought about him making the rule, "No ASP.NET Web Forms on public-facing pages, period. Use inline code or controls that don't require runat=server forms." 

But despite the despicable fact that you can't initialize your variables when you declare ("Dim") them, I do really like the fact that everything is convertible. For example, you can always compare Request("xxx") to "" (empty string) because it automatically does a CStr() behind the scenes, which also converts Null. It's just less coding that way.

You do have to know what you're doing, and what the language interpreter is doing under the covers, to keep from making the messy language that VBScript already is into a sloppy codebase. Most of the horrors of VBScript in times past come from the fact that it was so approachable and easy to write code with that people who didn't know how to code made a big mess everywhere they went. You had crap lying around everywhere. And nobody likes smelling or cleaning that stuff up.

But the alternative of a strongly typed language, particularly when one considers Web Forms, doesn't look a whole lot better. You end up with a huge amount of boilerplating and architectural, lifecycle bloat that you typically don't even need.

I don't know why Microsoft hasn't come up with VBScript.NET, a VB-oriented scripting language, with fully dynamic typing, that runs on the CLR. But I'm not shedding any tears. They did adopt IronRuby, et al.

These things said, would someone please send me ASP.NET MVC weekend/moonlighting work?! I can only take so much of this "g" stuff uninterrupted!

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

Web Development

gOS: Download FAIL!

by Jon Davis 6. December 2008 16:43

Download Now? I can't.. :(

I wanted to try out the Google Gadgets gOS at http://www.thinkgos.com/ because it looks interesting, but I can't even download it. The big fat Download button just redirects to itself or the HTTP request is canceled by the server--that is, the browse goes busy and then it stops, and nothing happens. I tried most of the mirrors, all of them were just too horribly slow, had an incomprehensible download web page UI, or ended up as 404s. The Torrent download just sat there at 0% for ten minutes despite stopping and retrying halfway into it, so I canceled that too. I tried all this last night but I just tried it again and got the same issues.

Here's a thought, why not let Google host gOS? Or would that just be too confusing since this is not a Google-created operating system?

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Computers and Internet

Silverlight 3: 3D Support, But Is This True 3D?

by Jon Davis 6. December 2008 13:49

Just a couple days after my repeat whine about Silverlight not having a rasterization API and 3D support I saw that Scott Guthrie announced that Silverlight 3 will offer "3D support and GPU hardware acceleration". I nearly crapped my pants when I read that. :)

What's not clear is whether 3D support will come via GPU hardware acceleration. I'm of the firm mindset that true 3D is OpenGL or Direct3D; anything else is fake. So if GPU hardware accleration is fully applied to the 3D support, it may be using OpenGL / D3D under the covers.

Otherwise, I'm just going to assume that the so-called GPU acceleration is intended to assist in video playback and vector graphics. And I only base that assumption on the fact that Adobe Flash "supports 3D" (has an API) but its hardware acceleration is limited to video playback and vector graphics. And I'm honestly not familiar with graphics acceleration on vector graphics, how that works, but given that they claim it, I believe it's feasible.

To be honest, I think it would be just about as bad if GPU acceleration was applied to 3D support but not to vector graphics.

Now on "rasterization", I over-use the word really, but all I wish for is two things: a mutable bitmap buffer, where we can plot pixels, and the ability to take "snapshots" of the vector brushes being displayed (i.e. myEllipsis.ToBitmap()) and export them to the same bitmap feature. This buffer should be reusable for textures on vector artwork as well as the coming 3D support. This is NOT an advanced component that would grow the framework, such a thing is EXTREMELY simple, particularly considering that Silverlight already supports images and manages bitmaps under the covers, it's just so heavily encapsulated that you're limited to URL maps and embedded files. I'm not asking for GDI+ functions! I just want to be able to retain a bitmap in memory and reuse it, and maybe be able to modify it by plotting pixels. There is no workaround for this; one could create his own bitmap class and write to a data stream but then Silverlight still can't use it (without persisting the data stream somewhere) because it's limited to URLs and embedded files!!

I'm starting to get a better picture of Microsoft in the Silverlight context lately. While I greatly respect Microsoft's tools and capacity to think brilliantly, as well as their enthusiast division(s) (XNA, Zune, Xbox, Games for Windows, etc), I think the fact that their enthuiasts division(s) are not very involved in the Silverlight product is seriously undermining the adoptability of Silverlight in competition with Flash. I acknowledge that there's not a lot of money to be made from it, but I at least consider it good marketing.

But on the enterprise business side, I truthfully cannot give Silverlight credit for meeting demand yet, despite the remarkable uses some have found of it (with some effort), because of the lack of high-level controls and APIs, although I fully respect and appreciate the fact that it is on track to meet demand. The new Controls Toolkit is great, but the controls as demonstrated in the samples, and the preexisting datagrid as demonstrated by normal use, all demonstrate that Silverlight has performance issues. Performance issues are of serious concern in business environments every bit as much as in enthusiast niches because it amounts to decreases in usability, which in turn amounts to turned off customers and ultimately lost profits. An example of this is the horrible scrolling performance issue, most seen in the datagrid, although I've come to realize that Silverlight's scrolling performance issues seem to have been improved somewhat since the last beta (when I stopped watching Silverlight because I was so turned off). Still, not improved enough. The Silverlight datagrid looks good until you touch it, and then makes your computer feel like something from the late 90s.

Actually, scrolling is only one example. It's user responsiveness on the whole; buttons have a similar problem. Actually, all the input objects have the problem. In general, while I don't question nor doubt Silverlight's capacity to look beautiful or to have very high FPS animations, etc., I think where it doesn't shine at all is in user input responsiveness. There are exceptions. Microsofts and Silverlight enthusiasts will always have some great demos lying around. But generally I've noticed a problem with user responsiveness, particularly when scrolling or dragging comes into play.

It's not a dealbreaker issue; not so bad that it's unusable. It's just bad enough to keep me from using Silverlight in everything I do. I prefer DHTML and its less-sexy appearance. Responsiveness is more important than appearance, and AJAX gets the job done in most cases. Silverlight meanwhile can fill in gaps where Javascript can't cut it, but then, so can Flash, and by the time you're already choosing to stick with HTML for the basics there's no compelling reason to use Silverlight except for the CLR and WMV support.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

C# | Silverlight

Busby SEO Challenge From Hell

by Jon Davis 6. December 2008 13:16

A company called Busby Web Solutions has been awarding competitors of "SEO contests", which I'm guessing promotes the practice of posting web content to experiment with the SEO performance of keywords and markup. The catch is that this has equated to essentially spamming non-participating web communities with junk posts in comments, etc.

We, the non-competitors, have been very fortunate that some such tests have been self-labeled with "Busby SEO Test" in the author's name. This could be simply be one competitor, but over the last month I have received about 20 comments posts on my blog consisting of variations of the text, "Thank you for sharing your article about {blog entry title}". I have modified my blog's instance of BlogEngine.net to filter out these Busby tests by looking for "Busby" in the author name. Needless to say, Busby Web Solutions is not making a very good name for itself. Not at all.

While there has not been a lot of damage done--nothing like the pornography posts that spammers are posting on phpBB forums everywhere--I still think that any automated junk posts should be dealt with. Typical CAPTCHA is a pain in the rear for users. This is an issue that will never die.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Blog

LINQ-to-SQL On The Web Client

by Jon Davis 4. December 2008 09:29

This is really old news, but something I didn't realize until last night at a Silverlight users group meeting.

Silverlight 2.0 brought us LINQ-to-Objects and LINQ-to-XML on the client. Bravo, yay, etc., but obviously LINQ-to-SQL was out of the question because you can't make an Internet-based T-SQL connection (i.e. over port 1433), for obvious reasons (*cough* security).

But Service Pack 1 for Visual Studio 2008, which introduced ADO.NET Data Services, also brought in along with it transparent LINQ-to-SQL support over WCF. This to me is bizzare. I haven't tried it, I only heard it mentioned. Frankly I'm worried about security, still, as it sounds a lot like RDO (Remote Data Objects) from back in the ASP Classic / ActiveX days, and which turned out to be a huge security disaster. Nonetheless, I'm still curious about how this might work securely and how it might make the workflow of a modern-age developer much, MUCH more pleasant than manually wiring up WCF for data synchronization to begin with.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , ,

C# | Web Development


 

Powered by BlogEngine.NET 1.4.5.0
Theme by Mads Kristensen

About the author

Jon Davis (aka "stimpy77") has been a programmer, developer, and consultant for web and Windows software solutions professionally since 1997, with experience ranging from OS and hardware support to DHTML programming to IIS/ASP web apps to Java network programming to Visual Basic applications to C# desktop apps.
 
Software in all forms is also his sole hobby, whether playing PC games or tinkering with programming them. "I was playing Defender on the Commodore 64," he reminisces, "when I decided at the age of 12 or so that I want to be a computer programmer when I grow up."

Jon was previously employed as a senior .NET developer at a very well-known Internet services company whom you're more likely than not to have directly done business with. However, this blog and all of jondavis.net have no affiliation with, and are not representative of, his former employer in any way.

Contact Me 


Tag cloud

Calendar

<<  December 2014  >>
MoTuWeThFrSaSu
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar