Thursday, November 18, 2010

Linq to Sql Error BC30002

I slammed up against a Yellow Screen of Death (YSOD) earlier today which just made my day.  And by "made my day" I mean that I wanted to scream, bang my head on the desktop, door and any other hard surface, and any other symbol of extreme frustration and angst which you deem appropriate.

Anyways, this YSOD, gave me the singularly helpful error message of:
BC30002: Type 'System.Data.Linq.Mapping.DatabaseAttribute' is not defined
Now, one would think that was helpful information. After all, it tells you exactly what's wrong, and it even tells you on which file it finds this bit of wrongness.

The problem comes in, when one considers that this particular file is a file that is generated by the Visual Studio IDE.  Worse yet, I was not getting any errors in Visual Studio at all.  Visual Studio was busy telling me how happy its little world was, while IIS was throwing up yellow every time I hit F5.

So, of course I turned to my good friend Google.

And found basically nothing. One person had gotten this error, and found out that it was due to conflicting namespaces.  Unfortunately, that wasn't the case here.

Then I did a slightly different Google search and discovered someone on the DNN boards who had gotten the same message, and that message is apparently an issue of the Web.Config not having all the required assemblies listed for it to do its thing with the LINQ classes.

I sat there for a moment, wondering how that could have happened to me. After all, I built the Web Site application from the ground up this morning.  I added the Linq-to-SQL classes via the IDE.  Visual Studio is supposed to take care of this for me, the same way it's done so a dozens of other times since VS2008 and Linq-to-SQL has came out.


Visual Studio hadn't.

Bascally, my Configuration/Compilation/Assemblies keys was missing this XML key:
add assembly="System.Data.Linq, Version=, Culture=neutral, PublicKeyToken=B77A5C561934E089" />

After that was added I got a working website, and life once more became good...

Saturday, July 3, 2010

Outlook's Query Builder

In Outlook 2007, Microsoft did something that well, I find odd. They coupled the Advanced Search functionality of the Outlook product into the Windows Desktop Search (or the "Windows Search 4.0" if you prefer).  The reason I find it odd, is that from what I've read no one likes Windows Desktop Search. Of course, it's hard-baked into Windows Vista and later, so some folks never had a chance.

Well, that's all fine and good, until you get to Windows Server 2008 service pack 2.

Which of course, is the operating system I'm dealing with.  You see, I have two Server 2k8 sp2 boxes working as terminal servers (with NTLB making them into a TS Farm), and have installed Outlook 2007 on them.  Well, the migration from the old terminal servers was going well and we got the users on the new boxes, complete with their 12-14GB inboxes.

And with inboxes that big, you can't not have advanced search capabilities.

Which is exactly what happened.

The users opened up Outlook, popped down the Query Builder tab and was presented with this:


Now, whenever you search about this issue, you're presented with a couple of interesting facts:

  1. If Query Builder is disabled, so is the Instant Search bar (the one right there at the top)
  2. Both Query Builder and Instant Search are dependent upon Windows Desktop Search/Windows Search 4.0

So, I'm quickly slamming my head against the table top where I'm working because I've got the following two facts going on:

  1. Windows Desktop Search/Windows Search 4.0 is not installed on my server
  2. Instant Search is working, just none of the "advanced" features

Which is an obvious impossibility according to everything that is being reported on the internet about how search in Outlook works.

So after fruitlessly searching the internet for more information, I give up in despair and call into Microsoft support. After the grilling phone call regarding how this is impacting my customer's business, I was promised  a callback within the usual 2 hours, and went back to searching to fill the time.

Well, an hour and a half later, I get my call back, and explain the problem.

Then I get on the Easy Assist tool and showed the Tech exactly the problem.

Then I got put on hold.

And thus, I waited in a soundless Limbo.

And waited.

And waited.

And waited.

Finally, the tech came back on the line, and I find out what I've been waiting for. Apparently, he had gotten his supervisor and a couple of other techs and built a Server 2008 environment and dropped Outlook 2007 on it to witness this for himself.

Of course it worked this way, and he came back with the statement: "You need to install Windows Desktop Search in order for the advanced search features to work in Outlook 2007."

Which in his defense IS the party line, and level one tech support ALWAYS follows the party line.

Of course, if solving this was something simple like installing WDS I wouldn't have had to call technical support.

So, since I had been EXPECTING this response, I let out my superior knowledge of my situation, and informed him that WDS refuses to install on Enterprise Server 2008 Service Pack 2. In fact when I tried to install, the installer told me that it was not for my version of Windows.

Additionally, I didn't want WDS as it's something of a resource hog, and when 60 folks are running on a terminal server at one time, well, resource hogs aren't necessarily good things.  But, I could handle a resource hog, if it got me the needed functionality, but again, it would not install so that was something of a moot point.

Well, informing the tech of this got me put back on hold, and the soundless Limbo.

Where I waited some more.

And some more.

By this time, I had been on the phone for the better part of an hour, most of it on hold.

Finally, he returned, and told me that he was going to have to get in touch with the special server support group for more information (my assumption is because he's realized that he can't get WDS installed on his 2008 test environment).

And here's some speculation as to what's happened so far in regards to development efforts and this situation:

Office 2007 was released and built to use the Windows Desktop Search search APIs. Then when Windows 2008 sp2 was released, it no longer supported the installation of WDS, and the Server OS team didn't talk to the Office team so no one knew to test that particular functionality.

My speculation up there is based upon the fact that nothing in the Office documentation tells you how to enable the Query Builder without the enabling of Instant Search. According to the documentation they are tied together intimately, and tied around Windows Desktop Search/Windows Search 4.0.

Digression aside, as the tech is telling me that we need to push this over to the server support group, I lay done my final trump card: during that two hour wait time, while I had been searching, I stumbled across an article on how to enable search services on Windows 2008 sp2, and doing so APPEARED to activate the Query Builder.

Basically, turning it on, made the screen look like this:


And the query builder appeared to work. Of course, what this is doing to my terminal server I have no clue, as I had drain-stopped this particular node of my TS Farm so I could tinker with it, thus I did not have the expected 50-60 users utilizing it at one time.

Worse, I have some reservations about this solution.  First, I'm running Outlook in ONLINE mode, and Search Services are only supposed to be impactive on the Outlook search if you're running in cached mode.  Second, Microsoft does not recommend Search Services for Enterprise grade servers (they're pushing SharePoint Services for search there). 

And that's the ultimate question I'm trying to get answered from Microsoft. What is this going to do customer's experience on their TS Farm, and if this is going to impact my customer's TS experience, how can I get them that stupid Query Builder.

Anyways, to activate the search services here, you perform the following steps:

  • Start Server Manager
  • Click Roles in the navigation tree on the left
  • Select Add Role in the Roles Summary section
  • Select the File Services role and click next
  • Select the Windows Search role service
  • Additionally, when I activated the system, I did not allow the Search Service to actually index anything—as I'm hoping that that will keep this from eating up resources.

    Now, it's just a waiting game to see what Microsoft comes back with here. 

    Monday, June 7, 2010

    .NET and the Unending Process...

    So I had a problem. In the scheme of things, it wasn't that big of a problem, at least provided that one didn't stop and restart an application multiple times without doing the same to their PC.

    As one might surmise from the TITLE of this particular post, my problem was a process that just refused to die when my application closed.

    This particular application is a rather massive WPF based Windows application, with hundreds (nearly a thousand) of source-controlled files, scores of icons, themes, and other references, thousands upon thousands of lines of code and to top it all off--the evil thing is multi-threaded.

    So, to say that this is a complex application is a bit of an understatement, and of course to make it all THAT much better, active development on it stopped about this time last year, so the code is basically bone-dry in my brain.

    Which of course meant that I had to find the cause of the problem, fix it and get it re-deployed within an hour. If not sooner.

    Since I'm a good Consultant, I did not despair, but rather fired up my trusty copy of Visual Studio 2008 and started stepping through code.

    My first thought was that this was something to do with THREADS! I mean, it just makes sense. After all, every time one turns around in this thing, a BackGroundWorker object is doing SOMETHING to data somewhere within its mass of code files or a timer is elapsing or... or something!

    So, I go about, making sure that all my Timers and BackgroundWorkers and ThreadPools were successfully closing and getting disposed of when my application was shutting down.

    Oddly, that made things worse.

    Not to be out-done by mere code, I applied an ENVIRONMENT.EXIT(0) command in the application's Exit event handler.

    "THAT should kill all the threads hanging out there," I thought to myself.

    So, I restarted the application, let it do its thing, and then shut it down.

    Only to have that phantom thread still left out there, eating memory but not really any processor time.

    I sighed, scratched my head and pondered things.

    And by ponder, I meant I started searching the web for possible answers.

    Which I found on an article that blamed this behavior on the .HIDE method of a form.

    So, I started scrolling through my code.

    After, scrolling through the first 1,500 lines of code in the first file, I hit CTRL+F and searched for .Hide.

    Which I found in the form of a dialog window that was responsible for re-calibrating data after a hard crash. This little guy was being created when I created my primary form, and thus would rarely get shown. Yet, that being the root cause (based on the 'HIDE' thought) didn't make sense to me. After all, it was a child of the primary form. When the primary form was closed, it should have received the notification and disposed of itself like all the rest of the form's children.

    So, I created break point in my primary window's CLOSING event, and then launched, let it do its thing for a bit, and then shut it down. My break point hit, and I started stepping through the code.

    And I made it all the way through the Closing event handler without a problem.

    And then my form was gone.

    I was amazed. Aghast even.

    After all, I had never removed the Environment.Exit command from the application's Exit event handler, and while stepping through the debugger I had never made it to the application's Exit event handler.

    In fact, Visual Studio was reporting that I was STILL debugging.

    And then a timer elapsed.

    To think, I would probably still be banging my head against the closest hard surface if not for that simple little timer.

    But, the timer fired, and I found myself in the code for the stupid dialog window.

    Which is when I remembered that I was dealing with WPF, and that my application was set up to not register itself as being closed until every form it owned was closed.

    So, I retrace the life cycle for this modal window, and realized that even though it doesn't always get SHOWN, it is always getting created, but is never getting destroyed.

    And the Framework is just assuming that you know what you're doing when you don't destroy windows, and is not going to clean those things up for you, regardless of who you believe is the form's parent.

    So, anyways, after making sure that that happy little modal window received a call to its .CLOSE method, I recompiled the application, let it do its thing for a bit, and then shut it down.

    And I'm happy to report that there were no phantom threads.

    Tuesday, May 25, 2010

    CodePlex & Updated Versions

    CodePlex is Microsoft's Open-Source repository, basically, their gift to the Open Source .NET developers out there. As such, it has a number of useful and worthwhile features in its code base for said Open Source developers, things such as issue trackers and discussion functions.

    It's good and I like it.

    But there is one place where it is lacking, and that's the ability to have the programs "call home" to the project page and make sure that they are the latest version of the software.

    Ideally, the way this would work, is that we would provide a key on the release page, and when a RESTFUL API was called, that key would be returned. Then a simple compare would do the job.

    Sadly, that doesn't exist.

    Even more sadly, I wanted my project to be able to do this. Basically, my goal is that after the application launches (provided the user wishes for updates to be checked), the application would call the eComic home page, and found out the key for the current 'recommended' release. If it was not the "recommended" release, then an icon would be displayed, and when pressed, launch the eComic home page in the browser, ready for downloads.

    Luckily, I figured out a way around this.

    Since the site provides an RSS feed detailing project releases, I have a viewpoint into the current release. Or at least, the last release that was edited. The other thing that the site provides is the ability to create "Hidden" releases. Basically, these are releases that you've not finished 100% and thus are not released to the public yet. An important thing to note regarding these hidden releases is that they do not show up in the RSS feed.

    So, what I did was I created the following settings in my application:

    • Check For Updates (User Setting)
    • Current Version (Application Setting)
    • Check Update Url (Application Setting)
    With the Check for Updates setting, I will allow the user to turn on/off the ability to perform these checks. That's just a simple and nice setting that any application that performs these types of checks should implement.

    The Check Update Url is basically a read-only setting, that is the RELEASES RSS feed from the eComic site.

    Finally, the Current Version is a read-only setting, in which I placed the string identifier for this release.

    After those settings were created, I went and generated a "Hidden" release, and got its Release Id from the query string.

    I then plugged that Release Id into the Current Version setting.

    Finally, I had a function which would perform a web request to the eComic RELEASE RSS feed. After grabbing the first item, I perform a simple compare on the associated link to see if the returned link held the Current Version value, and displayed my UPDATE icon accordingly.

    Placing it into a Timer.Elapsed event kept if off my main thread (meaning that the update check would not impact usability) and made it a slight delay from the application launch as well. The final thing is that the whole kit-n-kaboodle is wrapped in a Try/Catch block as I don't want a failure to connect to the web server to bring down the whole application.

       1:   Private Sub _timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles _timer.Elapsed
       2:          Try
       3:              Dim request As HttpWebRequest = WebRequest.Create(My.Settings.UpdateUrl)
       4:              Dim response As HttpWebResponse = request.GetResponse
       5:              If response.StatusCode = HttpStatusCode.OK Then
       6:                  Dim xDoc As XDocument = XDocument.Load(response.GetResponseStream)

       8:                  _currentVersionUrl = (From xe In xDoc.Descendants("item") _
       9:                                                   Select xe.Element("link").Value _
      10:                                                   ).Take(1).SingleOrDefault
      11:                  If Not String.IsNullOrEmpty(_currentVersionUrl) Then
      12:                      If Not _currentVersionUrl.Contains(My.Settings.CurrentRelease) Then
      13:                          Me.DisplayUpdate = True
      14:                      End If
      15:                  End If
      16:              End If
      18:              ' Check to ensure the link is a VALID url 
      19:              If Me.DisplayUpdate Then
      20:                  Dim re2 As HttpWebRequest = WebRequest.Create(Me._currentVersionUrl)
      21:                  re2.AllowAutoRedirect = False
      22:                  re2.Method = "Head"
      23:                  re2.KeepAlive = False
      24:                  Dim res As HttpWebResponse = request.GetResponse
      25:                  If Not res.StatusCode = HttpStatusCode.OK Then Me.DisplayUpdate = False
      26:              End If ' Me.DisplayUpdate 
      29:          Catch ex As Exception
      30:              ' Do Nothing.  If this fails, then I'm not concerned, as I'll just continue happily with the current version 
      31:          End Try
      32:      End Sub

    Monday, May 24, 2010

    eComic 2010

    Well, I finally got off my backside and slapped together the .NET 4.0 version of eComic.  In addition to all the enhancements which 4.0 provides to WPF I also streamlined the opening of the archive files, and added a host of additional features.

    The most important of these are:

    • Rebuilt form in .NET 4
    • Rebuilt Comic opening engine to improve speed and performance
    • Removed manual zoom control
    • Implemented programmatic PAN/ZOOM functionality on mouse events and ribbon buttons
    • Added progress bar charting opening archive progress to status bar
    • Modified page number/page name to allow selection of pages via that function
    • Added icon to status bar to indicate type of file loaded
    • Added ability to open a directory of images
    • Added functionality to create simple CBZ file from an opened directory of images
    • Added support for a 'full screen' mode
    • Added additional buttons to RIBBON element for ease of access to the functions
    • Allow for DragDrop of a file from Explorer to force open

    I'm still in the process of building documentation for the thing though, which is something I dislike, but you know how it is.

    Sunday, February 28, 2010

    1,000 Downloads for eComic

    eComic Download countThe latest version of eComic has been downloaded 1,000 times.   I'm all sorts of stoked about that!

    Even cooler is that when I checked the counts this morning, I managed to grab a screen-grab where it clearly states that there has been 1,000 downloads.


    Monday, February 22, 2010

    Gaming For Gamers

    Or, why I hate UbiSoft....

    I'm a gamer. I like video games. Much in the same way that I like cartoons, anime, comic books and all forms of speculative fiction in general. I've been a gamer since we purchased our first gaming console back when I was around five years old. Fundamentally that means that I've been a gamer for nearly as long as my little brother has been alive.

    My wife puts up with it with her usual loving patience. I don't generally play games while my kids are awake, but once they're down for the count, I can often be found shooting up zombies, flying through space or ruling my galactic empire with an iron fist.

    Frankly, I never really thought that I would ever stop being a gamer.

    Yet, UbiSoft is trying their best to make it that way.

    They have a new DRM scheme (and I'm amused that we always talk about DRM in the same way we discuss PONZI, as "schemes") in which the system is required to be ALWAYS online, or else you can't play the game. At all. Even though the game in question is a single player game.

    Think about that. This is UbiSoft saying that they will control your gaming experience and if you don't have the internet? Oh well, you shouldn't have purchased our game.

    Worse is the idiocy inherent in the "benefits" that UbiSoft is proclaiming far and wide in regards to the customer-hate which this DRM fundamentally is.

    Their first benefit is the fact that you can install this game on as many PCs as you desire. Which is funny, as I was always under the impression that that was always the case. Of course, there are some DRM schemes which breaks this, and only allow a limited number of installs per copy (see Spore) but that's anti-customer as well. The truth of the matter is, that I should be allowed to install any game I purchase on as many of my own devices as I desire. Once I purchase a copy of the software, where and how I install it is no longer any of the developer's, much less the distributor's, concern.

    The second benefit is the fact that you will no longer need the disc in the tray in order to play the game. Which is something that Steam has conquered quite well, and users do not need to be online all the time in order to play a Steam game. What's sad is that we shouldn't need to be slaved to an internet connection in order to do something which is just logical in the first place. I'd be pissed as anything if I had to keep a disc in the tray to use Microsoft Word or Visual Studio. Frankly, I installed the game, the entire game, onto my PC. There's no reason I shouldn't be able to place said disc back into storage so it would not get damage.

    The third benefit that UbiSoft is touting is the concept of saves in the cloud. Which is insane and pointless drivel. If I want my game save data to be shared between computers, I can easily tell the game to save data to the shared drive on my network, or I could even move the files manually.

    Of course, the thing that truly angers me is the fact that this system, basically violates the Right of First Sale. For those concerned, it is the Copyright Act of 1976, 17 U.S.C § 109. This doctrine is the legal right to sell or give away a lawfully made copy of a copyrighted work without permission. This DRM scheme breaks that law. It is DESGINED in such a way that I would be unable to give away or sale my legally purchased copy of the game. And regardless of what EULA's claim, the Courts have ruled that the Right of First Sale do apply to software that is purchased as opposed to licensed. I.e. if I go to GameStop, Walmart, Amazon or any retail outlet, then I am purchasing a copy of the work, as opposed to a company licensing 30 instances of Word for the PCs in the company. Bauer & Cie v. O'Donnell and Bobbs-Merrill Co. v. Straus were both U.S. Supreme Court cases regarding this, and the 2008 ruling in Washington in Timothy S. Vernor v. Autodesk Inc. upholds this right in regards to software purchases.

    Remember, I'm a developer as well here. I make my living building software, so these issues are of great importance to me.

    And I think this is bad customer service as well as a losing strategy for a software company.

    The thing is that this is not going to stop piracy. It's not. Consider, Winzip, a shareware program whose trail never expires, so users can effectively use it for free (once one gets past the "nag" screen) forever, is pirated software on zero-day sites. Pirates have all the time and energy in the world to crack the DRM, while the publishing company has limited resources to create it in the first place.

    This is not going to stop piracy. Worse, the only people who will enjoy the ability to play an offline game will be those who do pirate the game. Think about that; the only way to get an enjoyable play experience if you have any type of spotty internet connection (and who of us doesn't?) will be to pirate this software.

    And that's even before we get into issues of latency, DDoS attacks against the authentication servers as well as just pure unadulterated too many requests for the server to handle. Then there's the issues involving people with dial-in modems (sub-(a)DSL speeds which are the lowest that they will support) or that are not on an "unlimited" connection to their provider (which frankly, the internet providers dream that we will go that way). That's even before we get into their "promise" that they will release a patch to bypass the DRM if they ever do away with the authentication servers (my question is, if they do not have the revenue to power the servers, how will they have the funds to pay the developer to build the patch?).

    So, here's my stance: I will not buy another UbiSoft title.


    They have lost a customer for life, and there is nothing they can do to change that now. Even if they send me a game free, I will merely melt the disk enough so that is unusable, send it through my CD/DVD shredder, and then mix the remains in the detritus I scope from my cat's litter box.

    That is what their games deserve.

    They have shown that not only do they dislike their customers, but they are hostile towards them, and actively desire to insult them.

    Why do I say that? Well outside of the whole breaking of the Copyright Act of 1976 and the Doctrine of First Sale, when one looks at the FAQ for this abomination, one sees this:
    Why the need for a permanent Internet connection? Why no “offline” mode?
    The online services platform authenticates with a Ubisoft account and a permanent online connection allows us to verify that no one else uses the account at the same time. We know that services such as Steam offer an offline mode but this option is not as efficient in its protection against piracy.
    There at the bottom, where they talk about Steam, it states: "this option is not as efficient in its protection against piracy."

    The stance UbiSoft is STARTING from, is that its customers, the ones that purchase the game, are going to steal it. That is what they are saying, they are calling everyone who plays their game a thief.

    Frankly, I get peeved when the "Greeters" at Walmart attempt to stop me (and I do mean attempt, because I always ignore their requests to stop, and can't wait for one of them to actually touch me in an attempt to get me to stop), as I see it as the company believes that I'm stealing. I see it as an accusation of theft and defamation of my character (while it may not be enough to be upheld in court as defamation, I still feel it to be a defamation).

    And there's no difference here. This is UbiSoft accusing me of wanting to steal their video game. This is UbiSoft accusing everyone out there of wanting to steal their video game.

    So, my solution to that is simple: their software will never again be installed on my hardware.

    Friday, February 12, 2010

    Why A Free Kindle Is Still Too Expensive…

    TechCrunch is reporting that Amazon is considering the possibilities of giving a free Kindle to every Amazon Prime subscriber. kindle They're even going so far as to consider the implications of multi-year deprecation on the loss which handing out the hardware at no cost would create.

    Now, I love eBooks. Especially ever since I got a droid. I love the convenience of carrying around a library in my pocket. And in truth, I was excited about the Kindle when I first heard about it, just like I was excited about the Nook when I first heard about it.

    But there are things about both of these devices that make them no-go, in my opinion. What I don't like here is DRM and closed file format standards.

    Let's look at some of the fun things that DRM and closed file format have done for us:

    And those are just the things I found with five minutes of searching.

    But it gets worse. See, the Kindle uses the Kindle Format for its eBooks. These file formats are DRM'd up the wazoo, and the only device that they can be read upon are those that Amazon thinks are worth developing software for.

    Basically, this means that the books that you "buy" (read rent) from Amazon for the Kindle will only remain usable as long as Amazon remains a viable company, and willing to allow you to view them.

    Of course, this gets even worse when you consider that thanks to the insane laws in this country regarding DRM one cannot media shift these files.

    For an example of this, let's look at DVDs and Linux. If you run a Linux desktop or laptop, then there is not a legal way for you to view a movie that you have purchased. Sure, it's a minor issue to circumnavigate the CSS DRM system utilized by DVDs, but doing so, brings you into conflict with the copyright law, despite the fact that

    1. It is easily broken, and therefore no true protection
    2. Should be considered fair use (i.e. attempting to view your copy of the movie)

    Think on that, and apply it to these Kindle books.

    I use my Droid as an eBook reader, and the software I use for it supports ePub format (an open standard). Now, if I purchased an eBook through the Amazon Kindle eBook store, I would be unable to read it on my preferred eBook reader hardware/software combination. 

    Additionally, because the Kindle does not support ePub, then I would be unable to actually read those eBooks I do own.

    At no point do I want the content I purchased to be locked to a piece of hardware. I don't want to have to purchase the same reader every time just in order to retain the "right" to read the books that I purchased. The fact that I purchased the book should be enough to prove that I have the right to read them on any device I own.

    And that's why, even if it is free, an Amazon Kindle is still too expensive.

    Friday, January 22, 2010

    Android Development

    I'm a geek, and I enjoy programming. In fact, I enjoy it so much that despite doing it all day, I will often come home and actually do it more in the evening for the sheer enjoyment of it.

    This is most noticeable in my Codeplex project: eComic.

    That's something that I wrote and maintain and update fundamentally for the sheer enjoyment of it.

    Likewise, every time I get a new toy, I want to expand its capabilities, and make it do more. Since I'm about to get a new toy, I decided to preemptively set up my ability to play upon it.

    In other words, since I'm getting a DROID, I decided to set up my home PC to allow ANDROID development.

    Now, not to sound egotistical or anything, but I'm a smart guy; I work with computers day in and day out, and in fact it is my primary job description to make computers jump through the hoops I (or my customers) want them to. It's what I do.

    Which is why setting up that Android DEV environment saddens me so much.

    First off, the recommended environment includes the following elements:

    • Eclipse IDE
    • Android SDK
    • Android ADT
    Now, that's not the bad thing, the bad thing is getting all those parts working together in a cohesive hole which allows you to actually create programs for the device you're aiming for.

    Microsoft gets a lot of bad rep by geeks. It's big, it's massive, but despite all of the negativity from my peers, I LIKE Microsoft tools--especially the development ones.

    When I went to install Microsoft's IDE on my machine, I downloaded the ISO, loaded it up, and ran the SETUP.EXE file and followed the prompts, making relevant changes as needed/desired to customize my environment.

    Fundamentally, it worked. No hassles. No headaches, just thirty minutes of watching progress bars and then I was kicking and coding.

    Sadly, the Eclipse/Android SDK install was anything but that easy.

    Worse, because there was no installer (and consequently, the application was never identified to Windows) the whole thing flags UAC every time I launch it.

    But, I get the Eclipse IDE downloaded, and shortcuts added to my DOCK tool, and then I have to install the SDK.

    Which is a much Vista-Friendlier experience than installing the Eclipse IDE.

    Then I run into integrating the two. This involves telling the Eclipse IDE where it can download the Android ADT package, and then allowing it access.

    Now, I make this sound easy in this post. The thing is, it took me two tries to get it working. My first try was two weeks ago, and after three hours of trying to get everything installed, I gave up. Last night, I was successful, only because I followed the instructions in this article. Which despite being out-of-date, was much more informative and detailed than anything available on Google's Android Developer's website.

    Now maybe I'm lazy, and just haven't utilized enough of those "free" IDEs to realize the "proper" way to go about utilizing the things. Maybe having Visual Studio's installation be hassle free has made me dumber.

    Yet, in the end I think I'd rather be stupid that fight through setting up that Android Dev environment again...

    Friday, January 8, 2010

    Another New Version of eComic

    Well, I've finally gotten off my lazy backside and implemented a new version of eComic.  It's been up for less than 6 hours and it has already been downloaded 6 times.  Not bad for such a specialized application.

    eComicOf course the primary reason I work on eComic is to ensure that my skills stay nifty and sharp, as well as a place to learn new tricks and technologies for my particular field. 

    Which is why that as soon as I get both the SDK and my new phone I'll try working on an ANDROID version of eComic.

    But that's neither here nor there. If you compare this to the previous version you'll notice a few things, including that the navigation box is once again on the side. I felt that it just consumed too much of the reader's screen real estate at the bottom, especially with the thought that wide-screen monitors are becoming more prevalent.

    Secondly, if you look to the left side of things, then you'll see that there's a ZOOM control. In addition to the slider that will allow precise (in a manner of speaking) control of the zoom, there are also a 1:1 button which makes the image to be its "true" size and a FILL button which makes the control perform a "Uniform" fill of the image currently displayed.

    I considered those necessary with the things like the new Microsoft tablets and netbooks that are out there, and just anyone that doesn't have the 19+ inch monitors.

    At the bottom, there now resides a STATUS bar, which provides little things such as the current page being viewed, as well as the name of the file. I plan on having it also provide other details that can be found in the XML objects that can be associated with a CBR file.

    So, for my next trick, this is my current plan of attack in regards to functionality for this:

    • Work on display XML data in status bar
    • Provide way to view NOTES text (either from a Notes.txt file or appropriate field from XML file
    • Provide keyboard short-cuts for Menu Items found in the Ribbon bar
    • Work on CBR (well, actually CBZ as creating RAR files requires the purchase of a library while creating ZIP files is free) editor
    • Work on the GNZ editor
    • Implement the 7z decompression function (cb7)

    As always, content for eComic can be found in many locations, or even built yourself by scanning in your newly purchased comics.

    But two sites that provide free (and typically public domain) content for eComic are:

    Blog Widget by LinkWithin