Saturday, December 09, 2006

Oh, Microsoft.

About 30 seconds after posting this message my XBox 360's CD drive stopped working.

Thanks a lot.

GMail, you are _fail_

Every once in awhile Google does something that pisses me off.

Not as much as Microsoft (Microsoft seems to be doing this kind of shit in /spades/ recently, like they got stock in some kind of "piss off Arron" factory.), but enough to make me rage.

Christ, anyway, I'm trying to send a client an executable file via email, real simple procedure, right? Wrong. Oh, how terribly fucking wrong. "I can't send it because its an executable," Google astutely ponders, "And that means its a virus."

Oooh, fuck you GMail, fuck you so goddamn bad. Now I have to inconvenience THEM, this OTHER PERSON, now I have to give them the login details to my FTP, maybe they don't even _have_ an FTP client and have to download one, all because you motherfuckers have some disgusting hard-on against executable files.

Seriously, what the fuck is wrong with you? You think I can't turn a .py or a .rb file into a virus? You've got fucking integrated _virus scanners_ but you're banning .exe file extensions? _WHAT_ that makes _NO SENSE_ you are a /TECH COMPANY YOU SHOULD KNOW BETTER THAN THAT/.

God. For every 10 smart things Google does, there's always this inexplicably retarded one that's just hiding in the shadows waiting to jump out at you. I would love to _smack_ the sucker-fool who made this decision. Just smack the stupid out of him. because lord knows he needs it and he needs it _bad_.

I'm going to go take out my aggression on Rainbow Six Vegas.

Thursday, October 12, 2006

Boo + SharpDevelop 2.0 = production software

Recently some contract work I did involved creating an application for converting a "legacy" .txt file into several smaller .pdf files for various reasons that won't be listed here.

Due to the fact that this was going to be used by non-programmers and was a "one-shot" software application, I decided to use .NET 2.0... and Boo.

I really wanted to see how a Boo application would hold up if, instead of a quick hack, I used the normal patterns to build production ready software.

There are some glitches in SharpDevelop 2.0, but to be honest, its a really nice environment for creating and debugging Boo applications. Variables that are created in the scope of a method are given a different highlight color, then, say, assigning a value to a local class member. One annoying thing is that the version of Boo that #develop ships with doesn't support generics; I guess they haven't upgraded the Boo addin in awhile.

Boo didn't really get in my way when I was developing the application: in fact, due to the agile nature of Boo, I could write really terse code that was mostly self-documenting and easily maintained.

I say easily maintained because the client requested a modification to the application, and I was able to easily insert the new (and frighteningly different) functionality into the application codebase with ease.

One thing that I loved was using Boo's anonymous closures. A background worker thread had to frequently update the user interface. If you've used Control.Invoke before, you'll know what a major pain in the ass it is. Still, Boo reduced all the complexity to something as simple and easy to read as this:

1 self.Invoke() do:
2 enableControls()
3 fooBar()
4 setupLabel(true)

Or this:


1 processor.Finished += do:
2 self.Invoke() do:
3 chunkProgress.Close()
4 ThreadPool.QueueUserWorkItem() do:
5 Thread.Sleep(2s)
6 processor.Process()

All in all, it turned out just like a C# application would have -- except that thanks to the various syntactic niceness of Boo, development time went down and productivity went way up.


Still, Boo could be made better -- [property] is experiencing growing pains and should be made into a proper class member level macro, the generator syntax gets terrifying once you go beyond simple iterations, and the Boo parser error messages are strange, hard to read laments about tokens or whatever random crap it spews.

Tuesday, September 19, 2006

oDesk's free skill tests.

oDesk has a broad category of skill tests they offer to providers for free. Free is the reason I took one of oDesk's skill tests, and not-free is the reason I still haven't gotten an ExpertRating for my RentACoder resume'.

It's actually a good way to show your qualifications if you don't have any experience under your belt. Although I haven't quite gotten an oDesk job yet (I've decided to low-ball everyone and start negotiating for $10/hr just to get some time under my belt), people seem very interested -- from what they say -- at my test scores when they talk to me.

The tests are a useful gauge, I guess, but some of them need to be vetted more thoroughly. For instance, the DotNet Fundamentals test actually had an api question in there. Yeah. Now, I don't know about you, but I normally read the documentation / intellisense comments on any method or class before I actually used it, but here they seemed to assume I memorized all of the .NET BCL by heart.

I, uh, didn't.

In another test -- I think it was 'C# Programming' -- there were a handful of api questions in there as well. It was a bizarre question in particular, but I don't think I'm allowed to discuss it, but here's the gist of it:

"Class X does not have the following method:

..."

Yeah. That was kind of, mmm, dumb. I think I got it right because I had been using that class type just yesterday, but still, it's a completely irrelevant question to ask.

Still, they're free tests. If they're vetted once or twice by some independent sources all of the irrelevant questions can be culled from those categories and it will make for a better overall measure of someone's competency. I'd rather take a free test with a couple of flaws than pay for the very same.

tags:

Saturday, August 26, 2006

Peer pressure for the win.

I finally gave into peer pressure and applied for an oDesk membership. Assuming I'm in, I'll probably work part-time at first and test the waters too--wait, what's that?

"Peer pressure," you say, "what kind of peer pressure could that be?"

The pressure from indecisive clients, my friend. Most of the clients I work with on RentACoder are great: they respond quickly to questions, clarify any vague statements in their specifications, and are in general quite pleasant to communicate with. But -- according to my plucked-from-the-air statistics -- about 1 in 5 that I've worked with mean well, but that's it. In a fixed-bid system like RAC, I've taken to just calculating the hours required for a job and then submitting a bid for either workHours * 20, or for a really difficult job, workHours * 25. I make a tidy profit, deliver work to spec, and we both go home happy, right?

Most of the time.

Occasionally I stumble across a client who just eats into my profit margin like you would not believe. If expensive/profit pie-charts were made out of sweet apple pie these motherfuckers would just be eating me out of house and home. LET ME TELL YOU, SIR: IT IS NOT A DELICIOUS APPLE PIE THAT YOU NIBBLE ON. IT IS MY NEW XBOX360 YOU ARE EATING, SIR. IT IS A NINTENDO WII YOU, SIR, ARE DEPRIVING ME OF.

*coughs into fist* Anyway.

First, they decide that they want to up and alter a big chunk of the spec with what they consider "small changes" but end with me spending extra hours behind the scenes accommodating the new functionality and burying the old functionality. And then -- I shit you not -- changes their mind again and decide that they want some of the old functionality remaining. Thank someone for Subversion.

Then they decide that they've got to have a feature now-now-now in a rush and it has to be #1 priority to the detriment of the other projects (which languish for awhile and finish 2 weeks beyond schedule).

Eventually my hourly rate tanks and hovers around $15/hr -- at which point I put my foot down. They either have to cough up the money for the extras or they can deal with it as is. Of course, it always works out in the end -- with a little pressure they realize that they've overstepped their bounds and agree to pay for enhancements, or pay extra out of pocket if they need something in a serious rush (and by serious, I mean me working over the weekend). I usually charge double my rate if I have to work on the weekend due to lack of foresight by the client.

It's times like these that I think, "I really wouldn't have a problem with this if I was using a real hourly-rate system." They could fuck up the specifications all they wanted, and I could just plod along happily. After all, it is coming out of their pocket. What do I care that they've got a short attention span and like to change directions at the drop of a hat? I'd still get paid, right?

Recently, that kind of thinking has made oDesk a lot more interesting to me. I understand that it will be a drop in maximum profits, in theory, since the .NET providers working at the site are charging dirt-cheap rates. Some as low as $10/hr; most averaging $14/hr dollars, but I went with $17/hr for my application. There's a small number of providers on the site -- 3kish, last I read -- and most of them seem pretty qualified to be there. However, if RAC's competition numbers are anything to believe, I'm no chopped liver either.

Sorry, I just like the competition. Did I mention the exquisite glee I get when I crawl past someone on RAC'S top-coder competition?

Anyway, the way I see it, if I get into oDesk and land some solid jobs, it means on RAC I can side-step any clients that might be *really* annoying. This way I can afford to be more selective with what jobs I take and who I communicate with on RAC and not have to worry too much about the ramifications.

One really weird thing about an oDesk application: they recommend you download their sample coversheet and fill it in with all your information.

It's a Microsoft Word document file. So... dubbya tee f? I notice that they support Linux development with their oDesk Team Software, so why are they distributing the sample resume in .doc? I don't know about anyone else, but Abiword can't even open the document, and OpenOffice.org can display most of it, but all the page-spaces are just wrong and it comes out looking like crap. I pretty much mutilated my CVS (based off the sample download) and gave up after about 10 minutes of trying to make OO.Org export it Microsoft Word without completely destroying the format.

The most ironic part of the experience, of course, was that I had to download anything. Have you seen the oDesk website? I have. It's a slick piece of work.

So why do I even have to download their CVS template? Why do I have to upload my own resume' at all? Instead of all this fuss and extra work they should have, in my opinion, created a web-form based on the template, and let people fill that out instead. Hell, using a system like that they could even swap out templates using something fancy like XLS to transform the data. It would make for a lot more uniform profiles and let clients get to the most relevant information quickly.

Yeah, that's the coder in me talking.

Crap, ranted too long. Totally forgot what else I was going to write about.

Whatever,

Arron.

tags: , ,

Friday, August 25, 2006

Windows Communication Foundation + PeerChannel

One of my jobs recently required using WCF's "PeerChannel" p2p functionality for some kind of distributed system -- I didn't ask and he didn't tell, but judging by the prototype he had me mock up, it appears he's working on some kind of distributed chat-room, maybe for an existing application. This component was developed using the July CTP of .NET 3.0.

The samples included were out of date, which was really annoying -- I was basically guessing the name of the XML configuration elements, trying to get everything up and running. Eventually, though, I suceeded, after a lot of trial and error, to get everything compiling. Getting it working was another matter entirely. I can't get Microsoft's PNRP -- Peer Name Resolution Protocol -- to work properly, so I had to build my own custom peer resolver in order to get the p2p clients communicating with one another. Microsoft's PNRP is supposed to be a publically accessible way of boot-strapping p2p meshes built with WCF, but it seems to be down or just plain old broken at the moment.

Another big annoyance was the fact that p2p meshes in the July CTP can't have complex mesh names. Eg, you can have "net.p2p://CompanyName/Product/Service" as your target endpoint, but peers try to register for a mesh called "CompanyName" instead of the fully qualified path -- that can lead to a lot of collisions and headaches if you chose a generic enough word and try to use Microsoft's PNRP (or any other custom resolver, in fact). To work around this what I did was a cheap hack: "net.p2p://CompanyName.Product.Service" -- but it works. Hopefully this is an artifical limit or simply a bug in the July CTP...

By the way, Kevin Ransom's blog is a great place to find random information about WCF that you won't find the in documentation... like how to password-enable PeerChannel meshes. Did you know that since they use SSL you need to supply a freaking X509 cert just to apply a password to a PeerChannel mesh? I ended up creating a plain-jane cert using makecert.exe and just using that.

tags: , , , , ,

Monday, August 21, 2006

Can you feel his pain?

This dude got completely hosed by Northwest Vanline.

Man. I'm glad I live light -- if I ever have to move I can probably stuff everything (important) that I own into my car.

Rent a Coder's "all coder competition"

Man, something about RAC's "all coder competition" rankings (rules here, actual results here) makes me feel really competitive.

Once I finish up a few jobs in progress I'll be sub-1000; I guess that's not too bad on a site that claims to have over 150k registered coders. For some reason, every time I see myself climb over a  few other developers in the rankings it always makes me cackle sinisterly.

Must be something in my diet.

Anyway, I've recently subscribed to mobcode's RSS feed. I keep "bumping" into this blog everywhere I've go, and the articles this dude or dudette writes are pretty interesting and insightful. The subtitle - "how to code for money on the web" - is an eye-catcher anyway. >:)

tags:

Wednesday, August 02, 2006

What did you do, Flock?

I just realized that when I blog with Flock, Technorati doesn't parse those posts.

What did you do, Flock?!

Tuesday, August 01, 2006

oDesk vs RentACoder: code mercenaries have to get hired somewhere, right?

oDesk :.: The On Demand Global Workforce
Rent A Coder:How Software Gets Done

When I first decided that I wanted to work remotely instead of shuffle around from site-to-site jobs in Savannah, GA, I did a little investigatory research into my options. By the end of the week, I decided I was left with two safe options: RentACoder and oDesk.

I say safe because, unlike some of the other more notorious contract coding sites on the 'net (*cough* ScriptLance *cough*), there's really no way to be cheated out of getting paid. RentACoder uses an escrow service, which is pretty much a requirement for a fixed-bid system. They've got an arbitration system that works quite well from what I've seen. oDesk is based on an hourly rate system, so its not really that much of an issue and they make the guarantee on their site that you always get paid for hours worked, so that's cool too.

RentACoder

RentACoder works on a fixed-bidding auction-style system. Potential buyers put up projects, maybe set a price range they feel the most comfortable with, and sellers -- that is, coders -- put up bids. Bids are basically how much the coder would charge to complete the auction's specifications before the deadline.

RentACoder has a very low barrier of entry: anyone can sign up for an account and start bidding on jobs. That's definitely a bonus in my book; it's one of the main reasons I chose to try doing RentACoder full-time, but more on that later.

Although I've had my RentACoder account for almost a year, I never used it until about two months ago. That was the first time I investigated RentACoder, and I was not pleased with what I saw. Back then you could view the bids of other coders, both the messages left and the bid amounts, and it was... let me just say that it was a mess back then, in my opinion.

That was a year ago, though, and things have significantly improved in that year's time. Now the site seems a lot cleaner and tighter than it was a year ago.

One downside is that there's very little interaction between RentACoder and the rest of the community -- no forums, the blogs are rarely updated, etc. That's kind of disappointing, since to the timid RentACoder has a kind of a "thrown to the sharks" kind of atmosphere.

Another issue -- slightly bigger to me than their lack of communication with the community -- is the website itself. I'm not saying its ugly, but it seriously needs an uplift, for aesthetics and usability in general. The site is obviously showing its age; the coder financial page, for instance, gets really cumbersome once you've got several completed jobs under your belt.

Despite all that, my experience, after a few weeks of dealing with RentACoder, was really excellent. I don't regret picking them at all. But more on that later.

oDesk

oDesk is kind of the new kid on the block, and has a radically different model. I guess, in a way, they embrace the Web 2.0 model of doing business. They're a very responsive group; they blog very often, and they're not scared of dogfooding the oDesk model of business in order to develop the software powering oDesk. They embrace community interaction and they're a very responsive group with good feedback, a helpful forum of users, and etc.

oDesk embraces the concept of a "remote workplace" to the extreme. Using oDesk requires using their proprietary software system. It tracks how many keystrokes you've made an hour, occasionally takes a snapshot of your workstation screen so that Buyers -- the people who hire you -- can monitor you during "working hours." Creepy, right?

On the flipside, oDesk also offers a lot of awesome tools for Providers -- coders -- to use. Providers all working with the same buyer (or is it the same job?) all have access to Bugzilla, Subversion, etc -- the typical software development tools people working on a product together deploy, except that everything is set up automatically by oDesk.

Providers can pick their ideal hourly wage, send resumes' to prospective Buyers who have job openings, etc, etc -- oDesk has basically brought the traditional workplace to The Web, which is a great accomplishment.

Most of this information, though, is based on the oDesk forums and the information available on their website... which brings me to the downside of oDesk.

Joining oDesk looks like a real pain -- such a pain, in fact, that after working with RentACoder for almost 2 weeks it didn't seem worth the effort (still doesn't) trying to get through the signup process. It also seems targetted at old people--errrr, people who have been "in the business" for a significant amount of time.

Here are some of their requirements -- stuff you have to go through during the interview process.

1. Minimum 3 years work experience (Preferred but exempted in case of exceptional candidates)
2. Good resume (relevant work experience, experience with remote working, solid educational background)
3. Available to work on oDesk at least 20 hours every week
4. Tech-savvy, comfortable working over the internet
5. Able to deal with customer directly
6. Good knowledge of English language and good overall communication skills
7. Flexible working hours
8. Ready Internet Access (Broadband recommended)
9. Enterprising and ready to take initiative

Providers | Community


Yadda yadda, most of its typical. #9 is raw marketing, #4-8 are a duh, #2's kind of strange unless you consider the context of a "remote workplace" instead of RentACoder's auction system, etc.

The two biggest hurdles for me even experimenting with oDesk were #1, and the interview process itself.

For one, I never did really like interviews -- people tend to ask pretty stupid questions, like, "where do you want to be in 5 years" and random shit like, "weeeeelll, use a bubble sort on this array" where saying "qsort(array)" will not get you the job.

My complaints with the interview process aside, I'm just not really comfortable going through that kind of gauntlet over The Web. I'm not really an agile thinker, so realtime interviews -- all of them -- end up as "mushroom cloud"-shaped diasters for me. I also like my skills to speak for themself; I'm pretty secretive and tend not to give out information about myself or what I do other than what's absolutely necessary.

#1 was the real non-starter for me, though. I... don't have 3 years work experience. That's really it. I don't, and I'm not an exceptional candidate -- I'm just Really Good at what I do. I'm not even sure what I'd say during the oDesk interview: "I don't have 3 years work experience, but I'm really good at softare development?"

Although on RentACoder, mentioning Boo in a bid request is what sealed the deal and got me one of my first jobs.

I am, by the way, a rocking software developer -- that's what all of my satisfied buyers have to say, anyway. >:)

My choice.

As 90% of you astutely gathered, I ended up going with RentACoder. The pay's been slow -- I might have made more in the initial 2 months with oDesk than RentACoder -- but I've been working my way up (in terms of bidding and winning) and my reputation's been spreading, so now the issue of landing a good job really isn't really a problem anymore.

At the time of this writing, I spent some time checking out oDesk again. They've improved a lot -- they have a working feedback system now, for one -- but there's still nothing really compelling enough that would make me endure the interview process. It's a lot of time to spend for a site I might not even get into. Kinda like a high rate club, I guess. The draw just isn't there for me, though.

Anyway, that's all for now.

I blog, therefore I am,

Arron.

technorati tags:, , ,

Blogged with Flock

Wednesday, July 26, 2006

db4o + ASP.NET = ... s'alright.

I recently just finished up a couple of web application projects were I used Gentle.NET and db4o. Since I haven't blogged for awhile, I guess these topics will make good cannon fodder, right?

There are two immediate down-sides to using db4o: setting it up, and the GPL license. Since I was doing a web app the license didn't matter too much since its GPL 2, although if they upgrade to GPL 3 I'd have to start migrating some of these sites away. Fortunately most of them are "one-shots" -- I won't have to touch them again, nor will any one else, once deployed.

Setting it up is a one-time thing per project, but doing it is kind of a pain in the ass--you have to wander around your application, look for a good entry-point / exit point to setup the database and configurate it (configuration TO THE MAX ! ! !).

After that, though, db4o is just kind of seamless -- you just... use it. Of course, that's not without its few, niggling problems, like everything being an impilict transaction. This means that there's no way to start a "seperate" transaction. The codebase using db4o is littered with the following two lines of code, no variation:

AppUtility.Database.Set(object)

AppUtility.Database.Commit()

...

Everywhere.

It is really, really annoying. Since transactions are impicit this is absolutely necessary to avoid data-loss; and, of course, when I really *NEED* to use a transaction, I need to make sure everything's been committed to the database first, beforehand, so I don't rollback a ton of objects by mistake.

But, so far its been pretty unsurprising, which I guess is what you'd want from a database like this. It works, and that's all there is to it.

technorati tags:, ,

Blogged with Flock

Monday, June 26, 2006

MSN Spaces --> Windows Live Spaces

The Space Craft: Windows Live Spaces is coming!

You’ll notice some changes we’ve made to the header, including the replacement of the current text ad links with banner ads across the top. Of course, as always, if you prefer to see no ads at all in your space, remember you always have the option to switch them off as a subscriber.

The Space Craft: Windows Live Spaces is coming!


The quote is only included because it's a hiliarious backstep -- everyone on the 'net is embracing relevant text ads because they get more clickthroughs, but here Microsoft is, falling back on the old-school banner ad concept. I'd love to know what their reasoning is. Who still intentionally clicks on completely random banner ads? The only ads this past year I've intentionally hit have been Google and Yahoo contextual text ads, mostly because they're faster than jumping on a search engine and sifting through the results.

...

...

Yeah, OK. Anyway.

I used to have an MSN Spaces account -- its, uh, geekninja.spaces.msn.com if that's the URL format. I migrated over to Blogger because the technical restrictions, frankly, were starting to piss me off.

What got me most was the censorship -- back when I used MSN Spaces, I believe it wouldn't let me post a blog topic because it had the work "fuck" in it, or some such nonsense. I was like, what the fuck? Dude, dude, dude, I just wanna blog, is that not cool with you or something? I'll admit that MSN Spaces has a lot more features to offer than Blogger.com does, but at least Blogger.com minds its own business with regards to what I post.

Now, its too late -- I'm already firmly entrenched with Blogger.com and there's no going back. I already have two journals -- a personal Live Journal and this "tech" journal -- and there's no room for a third powered by Live. Sorry. :/


(side-note: Flock's blogging feature just stopped working. wtf?)

Sunday, June 25, 2006

60 seconds with Ubuntu 6.16 = 5 bugs.

Gnome doesn't remove shared folder references from smb.conf if I delete the folder without manually unsharing the folder first.

The concept of a folder name with a space in it is so reality-warping and tortured that Gnome refuses to awknowledge their existance, and so trying to share one with samba means that it crops the folder name: sharing "/home/arron/My Documents" is translated into "/home/arron" which isn't very useful.

Samba broke because some way, some how, during the upgrade process, smb.conf had inserted into it a section that had no name -- it was simply [] and broke the parser, hence all of Samba failing.

Samba still doesn't work after I've gone to all the effort of rolling up my sleeves and fixing all these problems by hand, so now my patience has run dry and I'm going to boot back into Windows XP. <--- show stopper, all of my audio and video is housed on this desktop machine, shared to my own little world.

The fifth bug is that I could probably break samba just by trying to share a folder named "printers" or "cdrom" since there doesn't appear to be any way to delimit a foldername from a special section name. Theoretical, but I'm sure it works.

This is why, no matter how irritating Microsoft Windows is, I won't be switching to Gnome any time soon. I'll take the less painful of the two, thanks.

technorati tags:, , , ,

Blogged with Flock

Microsoft is slowly starting to piss me off.

Little by little, but yeah, they're getting there. First, it was Visual Web Developer being a piece of shit -- freezing constantly, dragging the system to its heels every time I try to save a page, the visual designer actually inserting *BAD HTML* that fucked up the document when I switched from design to source view then back again.

Now it's fucking around with Windows Vista.

First, Internet Explorer is suddenly "broken" and ActiveX just doesn't work with it anymore. At all. So that means I can't use the ActiveX Akamai downloader for Vista beta 2. So what do I do? I try to download it manually, via GetRight. Except that the server I connect to DOES NOT SUPPORT RESUME, which I didn't notice until, cleverly, my connection dropped and the download suddenly started over from 0. Oh, but the kicker is I was at 3.0 gigs when the connection dropped, two hours into the download. Thanks.

So, annoyed, I spin up Firefox, deciding that I'll use the Java Akamai downloader, right? Except that when I log in and try to get to the download page, all of the sudden its telling me that I ran out of product keys, so I can't download Windows Vista anymore. What the hell do product keys have to do with downloading Windows Vista? Why can't you just say you can't give me any more product keys and let me grab Vista. Why don't you even tell me where I can find out how many product keys I already have and what they are?

So, finally, after having to SEARCH THROUGH MY BROWSERS HISTORY PANE like a freaking internet savage, I find the download link. I pop it into Firefox, the system freezes as Java lumbers into memory, and then, finally, the Akamai Java download manager is up and running.

Except its broken. Because the directory browser doesn't work, at all, unless I use the default 'My Documents' location. Thanks, Akamai. Or Sun. I'd like to think its a combination of both and just a sprinkle of poor design.

So, what happens after I finally quit meddling with trying to pick my download location and just start the download?

NOTHING HAPPENS.

Frankly, I'm just going to give the "manual" download link another shot. If it doesn't work, I'm just not going to bother with Vista, at all, until it comes with my next desktop.

It feels like every element of Microsoft is just slowly falling apart. I was really hoping that Vista would be the turning point, a corner stone in the foundation of more robust software development, but they can't even get the software to me without fucking it up six ways from Sunday.

God, you guys suck.

technorati tags:, , ,

Blogged with Flock

Saturday, June 24, 2006

WinFS is The Dead.

What's in Store : WinFS Update

I just read this blog article a few minutes ago. Here's a few choice quotes:

As most people who read this blog know, WinFS has always been about many things – a new model to enrich how users manage information, rich storage technology, and sometimes also a packaging of technology. The real change I am addressing today is in the packaging strategy.

What's in Store : WinFS Update

These changes do mean that we are not pursuing a separate delivery of WinFS, including the previously planned Beta 2 release. With most of our effort now working towards productizing mature aspects of the WinFS project into SQL and ADO.NET, we do not need to deliver a separate WinFS offering.

What's in Store : WinFS Update


That, my friends, is a really fancy way of saying that "WinFS is dead."

Look, I hate to break it to you, but you set out to build a "relational file system."

You're not delivering that product anymore.

That means its dead. How you managed to write -- lemme count -- 7 paragraphs about it is beyond me, because most of them are composed of, "Yeah, its dead, BUT..."

What you did do is gut an existing product, salvaged as much as you could, and abandoned the rest. That's admirable, but the original product -- and its dream -- is still dead. Just cop to it already.

technorati tags:, ,

Blogged with Flock

Tuesday, June 20, 2006

Day 2 with Flock / Blueshell for the win.

I'm still using Flock as my default browser.

Frankly, I couldn't do it at all if it weren't for the excellent Flock'd browser extension. I don't know how it works and frankly I don't care; all I know is that all my essential browser extensions work with Flock, so kudos to the extension author.

It's actually a really nice browser. I like the "Front Page" and rss feed view. Way better than Sage + Firefox, comparable to the RSS viewer that comes with IE7. So, yeah, that bit is pretty awesome.

A side-effect of using Flock is that I'm inclined to blog a little more, since its so "easy" -- quoting someone is as simple as doing a drag-and-drop. That's it, I'm done, moving on. I'm not a real hard-core blogger, so that's a definite bonus in my book. The blog editor it uses could be a little more... sophisticated, though.


Blueshell.

For the past week I've been doing some minor contract work; someone wanted me to whip them up a quick ASP.NET site, right? The technology we decided on was ASP.NET 2.0 / SQL Server 2005, so cracking out the site itself was a real breeze. But the one thing I've learned is that writing software is easy. Deploying it is hell on Earth.

So, what happens when I try to deploy on this guy's web server? Problems after problems after problems -- and all of them are because of his web host. Finally, we get most of them sorted out, but there's one big blocker left--it turns out the web host doesn't support SQL Server 2005.

Who hosts ASP.NET 2.0 but not SQL Server 2005? What crack are you smoking? Why, man, for God's sake, why?

So now I'm in some real trouble, right? Everything's been built for SQL Server 2005, all the tables have been populated, all the data binding uses SQL Server 2005...

Then Blueshell comes to the rescue. Specifically, Blueshell Data Guy. It's this real cheesy looking application, but it works perfect. It connected to SQL Server 2005, and let me export it to a multitude of database formats -- I used Access 2000, since I needed a lot of recent features.

So now it's like *snap-snap-snap* your fingers and everything is back up and running again.

So, yeah. Awesome software.

Blogged with Flock

Sunday, June 18, 2006

Flock 0.7

So, somehow I got around to hearing that Flock 0.7 finally came out. I made a mental note to myself to try it soon and, well, soon is here. I've been using it for a few hours. Not too shabby. it's got a helluva lot more polish than the last release.

So far, so good. There's an extension called "Flock'd" which somehow transmogrifies Firefox extensions into supporting Flock. Anyway, it's really awesome for blogging.

Watch this:

Flock: The web browser for you and your friends.


Drag and drop, from the browser to the editing pane. Pretty cool, I think.

I have quite a few Live Bookmarks that I use to keep up with my favorite online comics. The automagic importer didn't really put them into the awesome My News sidebar, so I had to import them by hand. UNPLEASANT.

Anyway, try it today. Doesn't hurt, right?


Try the Flock Browser Version 0.7.

Blogged with Flock

Sunday, June 04, 2006

TopDesk: incredible software for the win.

But really, what a crazy name.

Can't really blame them on the name game, though. Occasionally I start projects with ridiculious names because, in an IDE, you have to put *something* for the project name. Then you start using it here, referring to it there, modeling your namespace hierarchy with references to it as the product name...

Good thing the software rocks. TopDesk an "Expose clone" for Windows. Really terrific software. Fast, stable, and intuitive.

I've got it set up to show me all the windows when I move my mouse to the right edge of the screen, and show me the desktop when I move it to the upper left side of the screen. Pretty sweet.

Ever since I started using it, I've relied on alt+tab less and less. It's just quicker to "ram" the mouse cursor into the target area and get thumbnails for all the open windows. Real-time window updates, too, though there seems to be a problem with Firefox stealing keyboard input. To solve that I had to turn off "begin searchig as I type" in the Firefox preferences panel. Never liked that functionality anyway, but was too lazy to turn it off until it started buggering things up.

TopDesk great software, and with a price point of $9.99, I think I'll be buying this little gem. With price-range comes a set of expected functionality, and TopDesk in my opinion is worth every dollar of that $9.99.

Friday, May 26, 2006

It's summah time!

Summer time.

Got my laptop back, finally, so I can do more coding/dev stuff.

Should probably start looking for an actual summer job -- real work, not just a few hit-and-run consultancies.

Internship somewhere? Maybe. Would rather be a code mercenary on a more frequent basis instead. It's fun, exciting, and my skill makes all the girls go wild.

Wednesday, May 17, 2006

Update, update!

I hate writing blog posts about nothing, but I hate having a slow-updating blog, too.

Anyway: The #develop addin that highlights all references to whatever's selected by the caret is basically done. Haven't worked on it for about a week, since I forgot and left the source code somewhere without remote access.

Speaking of #develop, its getting really good--not that it wasn't, but I mean its getting better. =D

Haven't been doing much else. Really haven't been out searching for work since the last jorb; guess I've been feeling kind of lazy. Should probably take up some work just to keep myself from getting *too lazy*.

Heard that Sun plans on open sourcing Java soon. We'll see how that ends up going. +1 for Java distribution in OSS, -1 for Groovy still sucking pretty badly.

Wednesday, May 03, 2006

I live again / SharpDevelop2 / someone migrates /away/ from C#!

I live again!

My development laptop is still at the shop--a shop who is about to receive an untimely, unpleasant phone call if this continues. You know who you are.

SharpDevelop2

Things I plan to have a whack at when my laptop is back:

  • #develop2 addin: I wanna gank the feature in Eclipse that highlights all references to a variable when you put your caret over it. EG, you move the caret over the variable "cheesecake" and all instances of cheesecake are highlighted in the editor.
  • #develop2 addin: quick rename refactoring. Basically, instead of using the rename menu, I want this addin to monitor the names of class definitions, so when you're renaming one, all instances of that class name are renamed elsewhere. Really, that's what you were going to do /anyway/, right?

So far I've been playing with the #develop2 API in regards to its refactoring stuff, and the API, while robust, isn't very convienent to use. In other words, it's not really all that task oriented. This'll probably chance in the future, since pretty much everything else I've encountered is nice and easy to work with.

In my prototypes I can already see that I'm going to have to cut/paste the same block of code into both addins--it's the code that finds all references for the word at the current caret position. There's simply no other way to do it, and once people start exploring the refactoring ability of SharpDevelop2, I think it's going to become a very common idiom.

The problem with the current model for, say, finding references, is that it requires you to go through the parser API first, then use the result from that in the refactoring API. Not only that, you have to -- by hand -- determine which overloaded "find references" method to call, because there's no convienence method that simply accepts a base "ResolveResult" and correctly looks up the type hierarchy to determine if you're looking for a reference to a class, a local variable, or a class member.

So, basically you have to determine wheither the base ResolveResult is actually a type resolve result, a local resolve result, or a member resolve result, and then do the cast by hand before calling one of the find references method. That. Is. The. Suck. It's also code I'm going to end up duplicating in both addins. Ow.

Most of these issues could be fixed with very small patches to make the API "addin programmer" friendly, but since they'd most likely be over 8 lines, you'd have to sign their, uh, something-something-something license agreement. Not really worth signing paperwork just for a simple 20-line convienence method. Don't have a fax machine anyway.

Someone migrates away from C#!

This isn't something you see every day.

Foreward: Irrlicht is a very popular 3d engine, noted for its simplicity but very robust abilities. It's very competitive with Ogre3d, since Irrlicht makes up for what it lacks with a dead-simple API that lets you do whatever the hell you want.

Anyway.

The Irrlicht dude was writing an editor in C#, but suddenly decided to switch to C++ for some reason. When I read his reasons why, they seemed a bit weak--took me a couple of seconds to realize he was probably writing his C# code how he writes his C++ code, which is always a disaster--I'm assuming this, anyway, because his comment doesn't make much sense if you think of it any other way. He might have meant something else, and hit one of those purdy Language Barriers that crop up so often on the Internet. Interweb. Excuse me, Web.

He's surprised that the C++ version is faster than the C# version, and is left asking himself why anyone should use C#.

All in all, I think it's a pretty flawed comparison that he does, but still it's very interesting to read.

Thursday, March 23, 2006

ajaxLaunch? Eh.

You know what? I was writing a really scathing review of Michael Robertson's ajaxLaunch and its first application, ajaxWrite.

I was going to lament how he started off with a really cool premise, gotten my hopes up for a cross-platform Steam-like content distribution system, but then failed me with a lackluster AJAX application that only worked in Firefox, was slow as molasses, and had a terrible file-handling system.

And then ajaxWrite crashed by my browser.

That's right. Your crappy web application crashed the very thing it was designed to run on.

Oh, but that's not all of the irony, you see.

Blogger's post editor is a bit of an AJAX application itself. For instance, every few seconds Blogger is making a copy of my post for safe-keeping, in case I get disconnected or something, right?

Oh, wrong. Because, you see, Blogger apparently can't tell the difference between a page crash and the user navigating away, so when I restore my web-browser, using the awesome Crash Recovery extension for Firefox, I'm greeted with an empty blog post. That's right. Nothing.

So, when ajaxWrite crashed--destroying any valuable work I might have been in the progress of creating with it--it also brought down the rest of the house, thus throwing the baby, the bath water, and most of the tub out the window.

No, I'm sorry. AJAX web applications are never going to replace desktop applications.

Applications like OpenOffice.

You know, the office suite that has a robust document recovery mechanism that ensures all your content does not belong to /dev/null?

Not at this rate.

Here's the best part. It is the most egregious thing of all:

ajaxWrite doesn't work in Internet Explorer because it apparently uses XUL. Look, I can understand that you might want to short-circuit a lot of work that XUL does for you. Hell, I'm all for it, I use languages like C#/Ruby/Boo just because they do a lot of the grindstone work for you. But when you start yammering about the web and interoperability and people not following standards, and then do this...

From ajaxLaunch's FAQ:
"ajaxWrite requires Firefox 1.5, or newer, browser. We are investigating extending ajaxWrite to other browsers such as Internet Explorer. Let us know your feedback on the forum."
What makes this really rib-crackin' funny?
"ajaxWrite is compatible with any operating system, Windows/Mac/Linux, but does require that you use a Firefox 1.5, or newer, browser."
Yeah, OK. Trade-in one form of vendor lockin for another. That's real, uh, heroic.

Coup d'é·tat right there, mofos.

Wait, WAIT, I KNOW WHAT YOU'RE THINKING.

It just gets better, though. I mean, we've got Writely.com, which, fantastically enough, works in any standards compliant web-browser you've got, has a rich user interface, is a very responsive AJAX application...

This is easily the most disappointing thing I've ever seen come from Michael Robertson. The sad part is he really thinks this will replace Microsoft Office.

Man, you're starting to slip. Seriously starting to slip.

Saturday, March 18, 2006

IO Language

Someone just linked to me to Io, a language inspired by Smalltalk, Lisp, and Self. What surprised me the most is not that it embodies the concepts of these languages, but the fact that its syntax is clean, crisp, and for the most part, easily readable.

What I've really disliked about these kinds of languages is that their syntax is not something you read; it is something you study. That's always really kind of annoyed me, because I have other things to do than decrypt a language by constantly flipping through a dictionary or keep a cheat-sheet next to the computer.

Io, on the other hand, seems like a refreshing change of pace. Clear, concise. No violent cacophony of paranthesis clawing at the gates. Sweet.

The unfortunate bit is that its another one of those languages that has its own runtime and libraries, which always leads to the problem of there not being a lot of libraries. So not only do you have to learn the language, you have to learn the unique set of libraries available for it. Not really my concept of a good day, since the knowledge really isn't reusable outside this particular library.

I guess that's why I enjoy .NET so much--when I switched from primarily coding in C# to coding in Boo, I only had to learn the unique syntax. The framework library was familiar to me, so once I was down with the syntax everything else just kind of flowed together and became like gel.

Hm. Its almost 4AM and I'm still up. Guess I'm hungry. Hopefully this will be the last errant post tonight.

Shame on you!

I feel bad for this guy. Both for the hassle Google is giving him, and the insipid people trolling his journal.

Sometimes I have to really wonder, do people read about these things, or do they simply act on reflex and hatred?

I try my best not to fall into those kinds of social and mental pit-falls; evaluate each situation, make sure I understand before I shoot off on the mouth and make myself look stupid. I really think this is key for me because I was "raised" on the computer and understand that in the age of Google and other powerful information networks, data persists. For years.

Any thing I'll say on this blog will be enshrined in Google's search engine for years to come. If I were to say something terrifyingly stupid, I would have to abandon all traces of this nickname, forever and permanently, for all time.

I guess the people posting comments on that guys blog won't have that problem, because they're mostly anonymous, or ashamed of being linked to such slow, meandering thought patterns.

Other GUIs for .NET?

Someone asked me why I stopped blogging in detail about the other UI solutoins for .NET programming.

I'll be honest with you: they suck. Bad. wx.NET has an API that is only comfortable to C++ programmers, and System.Windows.Forms is basically a slightly cleaned up version of MFC.

While this is OK--no API is perfect--they're not really interesting enough to warrant a blog post for each individual one. While they are powerful APIs, they are also APIs that are showing their age. I wouldn't use them unless it was absolutely positively a requirement, which it often is. Still, I hate's em. Damn, do I hate's em.

I know people say the right tool for the right job, but if the right tool happens to be a feces-covered shovel, well, hell, you're screwed either way, right?

Guess I just like living on the edge of new technology.

Monday, March 13, 2006

Minor msbuild modifications for Boo.

I wanted to make sure my boo copy was in sync with the repository, so I went ahead and finished up the tweaking of the msbuild files for Boo. Mainly it was wiring up project properties to the booc task. For some reason the code to generate all the proper command-line switches was in the booc task, but the back-end wasn't wired up to the Boo msbuild target.

Those of you using #dev 2.0 and Boo and wondering where your .pdb files went and why you couldn't debug inside of #dev, well, its fixed now, but you'll have to copy the Boo msbuild lewt from svn over to #develop 2.0's addin directory.

I think what happened is, Daniel (Boo #develop hacking hero) had a modified copy of the boo msbuild stuff to make sure that it emitted debug info, and when he upgraded to the latest and greatest svn version of boo, he lost those modifications. Anyway, fixed now, so no harm no foul.

These'll probably be my last few modifications for awhile, unless something heinous pops up while I'm coding something.

Sunday, March 12, 2006

Oops!

In my previous post, I mentioned the new anyall module. Well, bamboo removed the module from svn, so please ignore the previous post about them.

Author: bamboo
Date: 2006-03-12 15:53:09 -0500 (Sun, 12 Mar 2006)
New Revision: 2167

Removed:
boo/trunk/src/Boo.Lang.Useful
/Functional/
boo/trunk/tests/Boo.Lang.Useful.Tests/Functional/
Log:
any/all were not formally approved and the tests were not passing
When I first checked in anyall.boo, the tests were passing, so I'm not sure what to make of that message. Looks like a minor bugfix I made to the anyall module last night exposed another problem, but I'm not sure if its a problem in Boo or in the module. Since its probably in the module there's no point in trying to debug it. ;)

Rant
What actually bothers me is the first half of the message -- that they weren't formally approved. I don't mind in particular that they were removed because the testcases were failing; its my bad for checking in the minor fix without running the unit tests.

But the first half of his message brings to light one of the most irritating things about Boo development. The major reason I stopped contributing code to Boo in the first place was that patches were just kind of dangling on JIRA with feedback from users, but in general ignored by bamboo. My given-when, Doug's given-when, the BOO-1 custom unit patch, Boo.Lang.Useful contributions, ckknight's optimized for-loop, are just kind of rotting as the codebase gradually change and the patches become out of sync.

Its very depressing--a lot of the people that have attached bugfixes to JIRA issues and contributed modules for Boo.Lang.Useful review that have been ignored in general. Nobody wants to write a patch that doesn't at least get looked at; it feels like a bit of a waste of your time, since the feasability of maintaining your own copy of Boo with the patch is very unlikely.

With SVN access, I was kind of hoping I could change some of that by at least working with the Useful contributions, updating the patches and merging the ones that seem the most popular, but if its going to take formal approval then everything is in the same situation it was before.

But, it is bamboo's baby, so the choice on how to handle the situation is ultimately his. I should probably take a bit of a break from hacking on Boo and find something else to do for awhile.

Sidenote: The one majorly annoying things with RTF input forms on a webpage is that you can't press tab and indent text. Tab has been historically reserved for jumping over hypertext elements in a web page, which means that some editors have simply adopted "indent" and "deindent" buttons on the toolbar.

Blogger doesn't have those.

Kinda hoping that the "threat" of XAML/WinFX encourages better user interface design on the web. XUL is nice but aside from the one Amazon.com XUL browser everyone uses to herald The Coming of The XUL, there's not much else using it.

I pine for the day I can press tab while editing a document in a webpage and stuff works like a real text editor.

Friday, March 10, 2006

Boo, life, etc.

Boo!

I got Boo SVN access. My first commit was a feature, BOO-675 I think, basically better delegate adaption. Boo is smarter now.

In .NET 2.0, the Thread constructor has can accept two kinds of delegates. One of them is parameterless, one takes one object as a parameter.

This meant that Boo had ambiugation problems with this kind of code:

t = Thread( { print 'Boo!' } ) because it wasn't sure if the closure was a ThreadStart delegate or a ParameterizedThreadStart delegate. I modified the scoring system so that Boo would check a callable (closure, first class function, etc) compared to any delegates it might match. In the example I just gave you, the scoring algorithm would give higher precedence to ThreadStart instead of ParameterizedThreadStart, since ParameterizedThreadStart takes one parameter, while ThreadStart takes no parameter--and this matches, perfectly, the callable, that does not accept a parameter either.

In the case of t = Thread( { i| print i } ) Boo would pick ParameterizedThreadStart instead, since they both match the best (one parameter!)

I also added the any() and all() functions. BOO-604. Here's a quick self-explaintory sample.

import System
import Useful.Functional from 'Boo.Lang.Useful'
class Vector:
public X as int
public Y as int
static id as int
def constructor():
id++
def constructor(x as int, y as int):
self()
X = x
Y = y
def ToString():
return "Vector #${id}; (${X}, ${Y})"
Above:
get:
return X >= 0
vectors = []
r = Random(DateTime.Now.Second)
gimmie = { return r.Next(-5, 5) }
for index in range(10):
vectors.Add(Vector(gimmie(), gimmie()))

#for the sake of argument let's say this is a videogame.
#we're making sure none of our vectors are in the negative, since that means they're underwater or something.
result = all(vectors).Above
if result:
print 'All vectors above ground'
print result
else:
print 'There are vectors not above ground!'
print 'The following vectors failed.'
print result.Failed
#Let's assume this is a vehicle coordinate system. At least one of the vehicle's vectors has to be above ground
#for it to be working correctly.
result = any(vectors).Above
if result:
print 'At least one vector above ground'
print result
else:
print 'None of the vectors above ground!'
print 'The following vectors failed'
print result.Failed


Here's some sample output.
There are vectors not above ground!
The following vectors failed.
[Vector #10; (-2, 0), Vector #10; (-4, 2), Vector #10; (-4, 0), Vector #10; (-5,
-1), Vector #10; (-5, 1)]
At least one vector above ground
Passed (5): [Vector #10; (3, -1), Vector #10; (2, -3), Vector #10; (2, -3), Vect
or #10; (4, -3), Vector #10; (3, 4)]
Failed (5): [Vector #10; (-2, 0), Vector #10; (-4, 2), Vector #10; (-4, 0), Vect
or #10; (-5, -1), Vector #10; (-5, 1)]

Its a bit more useful in actual practice.

EDIT: oops. You'll notice I made a juvenile mistake with the id. I meant to have a private _id property to go with the static id property, but I got bogged down in tracking down a bug I found in the any/all implementation concerning null values. Tch. Oh well. Go ahead, laugh, jackass.

The upside is that the anyall module is now minus 1 bug. ;)

Dolla Dolla Bills

Haven't gotten much love on the code front, lately. Not surprised--the usual suspects seem to be busy or not in desperate need of a code mercenary. However, the prospect of having to float a resume'--an actual, genuine resume'--on somewhere like Monster.com does not strike a chord with me. Hopefully something comes my way, as I'm not looking to get my fingers into anything seriously long term--I like the short-term hit-and-run kind of stuff, myself.

We'll see what happens.

Saturday, March 04, 2006

Subliminal advertising: YOU WILL HIRE ME.

Yeee haw! Its that time of the month (that was a quick one, wasn't it?)

I'm available, again, for short term .NET-based contracting work.

I'm a very discreet software engineer, as some of you may not know. What it means is, if asked, I'll be sure not to rattle you off as a reference when asked about previous employment opportunities. I understand that, on the Internet, anonymity is preferred in a great number of situations.

As a result of this, though, I've given up on carting a resume' around (never updated the one I had, anyway) and typically like to say that I know what I'm doing when dealing with:

Languages:
  • C#
  • Boo
User interfaces:
  • Windows.Forms
  • wx.NET
  • GTK#
.NET platforms:
  • 1.1
  • 2.0
.NET/relevant technologies:
  • ADO.NET
  • COM interop (RWAR!)
  • XML
  • SQL
  • Sockets
  • Webservices
  • Reflection
  • In general, the requisite technologies needed to build and maintain.NET application.
Misc:
  • I have experience in exposing Boo as a scripting language.
  • I also have minor experience in writing technical documentation, but am confident that I can deliever concise, easy to understand documentation on demand.

and I have dabbled with (and can learn more on demand for)
  • ASP.NET (cavaet: I am /not/ good at making things look pretty)
  • Code Access Security
  • IronPython
Money (The Green):
Typically I charge a flat rate. I like doing this because people can come to me with small problems and not feel like they've been gutted like a pig afterwards. However, if the work is in flux, or you estimate that you'll need X amount of man hours to make the magic happen, I can quote you on some hourly figures if you give me the sufficient information required.

I'm also down with "profitable charity work," like software bounties for your favorite open-source .net applications. I prefer these software bounties to be very precise due to the constantly changing nature of open source projects, and some project mantainers being hostile to patches from strangers. ;)

email / jabber: l33ts0n@gmail.com
My cell is available on request.

Sunday, January 22, 2006

GUI frameworks available for .NET: GTK#

This is my second post about user interfaces available for the .NET, which I will probably call the "CLR" from here on out, since its easier on my fingers. The first part is here, be good to it.

As a special note, GTK#, the toolkit I'll be talking about, just recently had a new release. I'm going to be discussing an older version because I have not really had a chance to explore this version in depth.

Now we're going to discuss...

GTK#
A binding to the graphical user interface called GTK+, GTK# is easily a step above the rest when it comes to API quality and expressiveness, when you consider the alternatives. On the pecking order, GTK# comes in closely behind WinFX, and way, way ahead of S.W.F and wx.NET. I'm going to ignore GTK+ entirely, and write this blog post as if GTK# was the whole kettle.

GTK# uses a container based layout system, which is basically a fancy way of saying that you drop down a container, tell it how you want it to layout your controls, then start flinging those controls like spaghetti onto an artist's canvas. Although this sounds pretty haphazard in theory, its possible to make a beautiful and usable user experience using GTK#.

GTK# uses an xml-based serialization format, called Glade, that enables an abstraction between user interface design and wiring up the controls to the data-driven back-end. Unfortunately there are very few graphical designers that support GTK# and Glade, and so inevitably you have to rely on The One True Glade Designer. Its got an awful user interface and should not be used to judge the abilities of GTK#, because it falls short. Very, very, very short. Midget short.

There's plenty of base controls, in particular the powerful TreeView that allows for different styles of data visualization. However, there is a distinct lack of convience when dealing with GTK#: although virtually nothing is impossible due to the robust way GTK# is built, some of the most commonly repeated idioms do not have any convient shortcuts, which means that for even some of the simpliest scenarios--like simple listboxes filled with text--require an inordinate amount of effort given the task you want to accomplish. It would be nice if GTK# shipped with a lot of prefabbed controls for the most common user interface idioms, but that does not seem to be the kind of development paradigm they're going for.

GTK# is crossplatform in theory, but the platforms with the strongest support are really just various Linux distributions and of course Microsoft Windows. It can run under Mac OSX, but I have been told that it is not a pleasant experience by some. Not having a Mac, I can't really say anything more. I myself have successfully gotten GTK# programs to run on Windows and Ubuntu without recompiling.

There's a lot of things that seem to be amiss if you touch on GTK# after having done WPF development for awhile; most notably, you can't arbitrarily place a control inside of a control: you'll have to "paint" it by hand yourself, and, as far as I know -- I haven't done anything beyond *drawing* the controls -- wire up the events as the parent control receives them. It is nothing brutal, but the time spent custom painting controls could be better spent doing something--anything--else. Most toolkits suffer this flaw, so if you have no experience with WinFX, then custom drawing is standard. Other things WPF developers will find lacking is "styling" and the magic of the, uh, what'chu'call'it, DataContext, I think, but that's about it.

All in all, its a pretty good toolkit if you need to write an application targeting Mono and any of the platforms it supports. I think if a lot more effort was put into making the API more agile then it could see itself being on common footing with WinFX. It compares quite nicely at its current state, however, so don't dismiss it outright. ;)

Score: 7/10

Monday, January 16, 2006

GUI frameworks available for .NET: WinFX

I thought I would do a little blogging on the user interfaces bindings currently exposed to .NET, and how I feel about them, their APIs, and their documentation: basically the stuff you need to know to work with the APIs, and the APIs themself. They're in no particular order, but I'll give them a rating from 1-10 based on how fluid it be, yo.

Each blog will focus on just one user interface framework. Let's get it started.

Windows Presentation Framework (WPF)
When you first look at the API, it is mindblowing -- there is shit everywhere, and the inheritance and interface definitions are off the chain. For a moment it seems like one big cluster fuck, but this is one of those situations where examining the API without using it is a Bad Thing To Do. After a few hours working with it, I began to realize the reason there were so many interfaces and inheritances trees was to keep things simple. You only implement what you need, nothing more. This is a startling contrast to most of the UIs that have .NET bindings (including Win32 itself), where there is generally a huge base class with lots of overriable methods and properties. At first glance it seems like a sweet deal, but then you run into "ok, what is the absolutely minimum number of virtual method/properties I have to override?"

I really began to appreciate the design when I started to do more complex stuff. I needed a "Icon List" control, which is basically a panel that holds a bunch of icons, with optional text beneath each icon. There's no such convience control in WPF, so I realized I had to make one by hand. It only took minutes to get the basic functionality in: the main panel, to hold all the icons, was a WrapPanel. Each of the "icon" elements was basically a Canvas with an image on it. The best part was when I realized I wanted to add "tagging," support, all I had to due was plop a text box down, anchored to the bottom of the Canvas... and I was "done" so to speak.

"Styling" controls is really easy, and in fact one of the things I really like about the WPF. One style can apply to any kind of UIElement, really, which are the building blocks of user interface controls. So you can apply the same style to a radiobutton and a textbox and achieve the same result. Really cleans things up quite a bit.

The fact that any UIElement can be placed inside of another UIElement becomes invaluable after spending a few days with it. It makes compositing controls a real killer feature. This is to be expected, though, since WinFX is a "next gen" API and isn't carrying the baggage of backwards compatibility, so it has no other choice but to be better than the current toolkits or die trying.

There's other goodies I haven't had time to jump into, like DataContext, a really sweet way of data-binding. Basically this is how you tell UIElements to interpret your class/structure. Then all you have to do is supply your object and things work like magic.

Still, there are some serious downsides: documentation, for one, is pretty much nonexistant. The API is in constant flux as well, since every CTP makes a few dozen breaking changes. I would not ship software targeting any given CTP of WPF right now, but software that doesn't have an "offical" release until sometime next year is a good canditate, in my opinion. I know that I'm using WPF right now to develop something.

Score: 9/10


Friday, January 13, 2006

Back in the game again.

I'll be available for some work-for-hire starting today. I know C#, Boo, and if I must -- I mean really if I must, Java. I like to charge a flat rate for the work I do, and there'll be no problems as long as you don't suddenly up and make a major change to the requirements.

Thursday, January 05, 2006

Opera > Firefox?

I just read a blogger article linked from OSNews -- a site whose link quality is slowly degrading. However, it does provide little gems like this one:
Popular Technology.net: Opera is Faster, More Secure and More Compliant than Firefox

Now, I'll be the first to say that Opera is a very good web-browser, but this guy does more harm than good to its community. You notice right in the beginning that something wayward this way comes, with the fucked up metric of using vulnerability count as a blanket way to consider how secure a software product is. In reality, I think most of us would take ten (10) javascript vulnerabilities that with infinitely looping javascript prompts over 1 (one) 0-day exploit like this one.

Unfortunately, the article only gets worse from there, and ends on the less-than-subtle note of him/her/it arbitrarily declaring Opera the best browser. What pains me the most is that some potential Opera users are going to read that blog entry before they try the browser itself and immediately be put off by the attitude of smug superiority justified by a random link and a short pithy two-three sentance paragraph.

Personally Opera has a lot going for it, but until we're able to write extensions for it -- there are some that exist for Firefox like Scrapbook, and Location Navigator, that I cannot live without -- I'll be sticking with Firefox on point, with Opera covering the flank until it gets a bit more experience in the field.

For people who don't like customizing the browser (quite a number of people), Opera is on it like white on rice, since the "out of the box" experience everyone always oozes on and on about is much better than Firefox's.