Monday, May 31, 2010

Two Years Later...

As is typical of my behavior online, I haven't touched this blog in nearly two years. Shenanigans like these are probably why my personal website died off, if I had to speculate. I'll refrain from lying to you and making false promises about how I will write more frequently, etc. You don't need that.

This blog did something silly whilst I've been living my life and ignoring it. Evidently, my rant against NetSuite was used as source material against them for fraud and shitty business practices. I was actually contacted at one point to be alerted it might be used in a class-action lawsuit, although I never responded nor took the time to validate this.

The last two years of my life have been pretty good. In September of 2008, Lily and I moved into the track home we built with McMillin. I did a bunch of customizations like adding a patio, kitchen island, upgrading my counters to granite, pre-wiring surround sound and CAT-6 gigabit, and a built-in entertainment cabinet. I have some minor issues with the build quality (there's some A/C vents skewed, and I had to get some tiles re-glued in my kitchen) but overall I'm quite happy with the house. Ultimately, the maintenance is irrelevant when I remind myself that I bought a home at 23, and have never missed a payment. Ex-girlfriends and enemies of my high school days: suck it.

2009 kinda whizzed past for me, as I was pretty heavily involved in my work and wakeboarding. Through a coworker, I met this guy Alex who is an amazing wakeboarder, and also happens to be the business development manager for Topless Blonde Ale. In late 2009, Lily went to Mercy Ministries for 6 months. Without getting into the theological/ideological issues, I'd like to simply state that she seems to have grown up quite a bit in the program, and that has been a good thing for us.

While working at Ramsgate/ProGauge, I've been given tremendous room to innovate. Rather than just sticking to what I know (Java, PHP + MySQL, C#), I've been able to expand to working with ActionScript, PostgreSQL, jQuery + jQueryUI, and recently took up an interest in playing with Node.js. Since I started in 2008, I've been building an analytical tool called ProGauge Prime, which is my primary work. Sometime in 2009, Dustin and Brent joined on. As a team, we created a new piece of technology called an ICP (which we apparently do a terrible job of marketing, because I cannot find anything about it on our own site). Actually, this article on ProSoft's website does a pretty good job of depicting our integration with PXP, although it grossly overstates ProSoft's involvement (they sold 3 radios, we engineered and actively monitor the entire SCADA system).

I'm going to close this elongated status update with a piece of advice, since information about programming was pretty scarce when I was a kid. For those aspiring coders/hackers/"software engineers": do not overlook the energy or automation industries. They are in immense need of philosophical and technological modernization. Some examples: closed, proprietary protocol, closed, proprietary protocol, grossly-overpriced archaic technology, bloatware, grossly-overpriced archaic technology, grossly-overpriced behemoth software.

Saturday, August 2, 2008

Back to Linux, again.

My first adventure with Linux was installing Ubuntu 5.04 (Hoary Hedgehog) on my server in mid-2005. At the time, I was still essentially a rabid gamer, and couldn't possibly conceive of installing a non-Windows operating system on my primary computer. None of my Computer Science classes at SJSU required a Unix-based operating system, OS virtualization was in its infancy (I'd say it still is), and the WINE project hadn't gotten very far with 3D acceleration.

When I took up an interest in Linux, it wasn't to change the operating system of my desktop, but of my home server. I've long had a home server, back before they were trendy. Since about 7th grade, I've run a private website of one kind or another, and I quickly left the realm of Tripod, Angelfire, and Geocities for build my own server. The server gave me full control over my content, and comparatively limitless space to store the pictures and sound clips I wanted to include in my "web posts" (the term "blog" didn't even exist back then).

So, I downloaded a copy of this new OS "Ubuntu" and burned it to a CD. So far, so good. What happened next is something that the informed reader knows all too well. A recent XKCD comic encapsulates it nicely:

Some time later, I found myself fairly competent poking around Ubuntu, and I tended to come home from a class only to hop onto the server via VNC and start breaking things. I got bored, and started inquiring into what else I could make the system do, now that I had unprecedented control over the machine.

Digging around in my big box of computer parts, cables, USB trinkets, and dust, I discovered an old Hauppauge WinTV tuner card I had somehow obtained from one of my sister's friends when I was in high school. I threw it into the server, and started Googling (genericide for the win) Linux applications which could make use of this hardware. I quickly came across MythTV, and the next day I was the proud owner of a "FreeVo". Inevitably this led me to constructing a serial port infrared receiver, installing LIRC, and using a standard universal remote to control MythTV.

For a long time following, the server worked as a media center pc (again, before that was the name for it) and my roommates and I enjoyed free low-quality recordings of our favorite tv shows. MythTV had a lot of bugs at the time, and would frequently crash, which forced me to repair something every couple of days. Ubuntu was only in its second incarnation then, and things didn't "just work" consistently, yet.

At some point later on, I quit World of Warcraft (for the first time, hehe) and installed Ubuntu on my desktop as my primary operating system. I was fairly confident at this point that I could make the transition, but I wanted to keep Windows XP as a secondary operating system just in case. To do so, I used Partition Magic to split up my partition into two, and left Windows XP on the smaller one.

Almost immediately I started having troubles because of the transition. See, migrating a server platform to another is pretty straightforward, because you don't use the machine to open spreadsheets, play games, or visit websites. I had to install WINE and Internet Explorer, because my school's web application for viewing student records was a rotten piece of crap and truly didn't work on FireFox. I had to use my Windows partition for Excel, because OpenOffice didn't handle cell merging quite the same as PHP PEAR, which I had used for my job to build an Excel writer for cost sheets. I also had constant problems with my wireless card, because the wireless stack support in Ubuntu was practically nonexistent at the time. I had to use ndiswrapper and reference the Windows drivers for my wireless card, to keep it running.

Things eventually ironed themselves out, but within the year I took a job writing a Windows standalone application and was forced to switch back to Windows. I've been using Windows since then (late 2006) and complained occasionally. Mostly, I've been waiting for Linux to improve. And boy, has it.

With my newest job came the requirement of eventually purchasing a server to power the application. Naturally, my first choice was Ubuntu Linux, and I was more than impressed with how far the OS has come since I left it. Setting up the professional-grade server went so well, it made me reanalyze my current setup at home. See, now I work in an office, so I can do whatever the hell I want to my desktop.

Before venturing back into Linux, I checked nonstandard issues I knew I'd have to solve. I researched the new Atheros wireless stack, VMWare Server and VirtualBox, how to setup Ubuntu to network with my Apple Time Capsule, and checked to see if the various applications I occasionally use have Ubuntu equivalents. In every category I was satisfied, so I transferred all my Windows data to the Time Capsule and nuked my partition tables.

So far, Ubuntu has been running very nicely. I had no problems setting up my dual screens, ATI graphics, Compiz Fusion, and Samba networking for my Time Capsule. I did have troubles with VMWare Server (mostly due to the fact I'm running 64-bit), so I decided on VirtualBox for any Windows-related testing. Neither supports 3D acceleration, so I'm probably stuck with using WINE-compatible only games/programs, or finding a Linux alternative. OS virtualization still has a long way to go. Also, VirtualBox doesn't support OSX, which bothers me as a developer, since I'm primarily a Java programmer and want to be able to test on XP, Vista, OSX, and Linux GTK.

Every now and then I'll get a random kernel panic that drops me out of X11, but I haven't diagnosed the problem yet, because it's only happened a couple of times. Now, I do get occasional bugs like this on my MacBook Pro as well, so it's not like this is the end of the world. I understand no operating system is perfect, and there's likely a couple hundred thousand reported cases of exactly the same bug I'm having, so I figure I'll wait for one of the automatic updates to eliminate it.

The developers of Ubuntu have done a great job of keeping pace with OSX, and surpassing XP and Vista in terms of stability and gloss. Everything that is said to work simply works. I don't have to fight with a task manager to kill applications when they stall for no reason. I don't have to question why half my paging file is full, when I just booted up. I don't have to use a firewall, antivirus, or adware protection. But most importantly, I don't have to wait 196 minutes (not joking) for 30MB of files to copy to my Time Capsule.

Wednesday, October 17, 2007

Shipping Software, and The Official NetSuite Rant

Warning: this post contains some information regarding my job which may be considered "sensitive", though is not contract-violating in any nature. Recently a handful of bloggers have had their jobs taken from them simply by venting about work on their blog. In truth, the reasons they were fired typically involved citing names or exacting descriptions of their coworkers, followed by stating inappropriate things about them. Be it known that my aim in this blog is not to critique any individual, but rather the industry I work in, and a specific product with which I am dissatisfied.

Shipping Software


The shipping industry, from a software perspective, is similar to many others. Like the health and oil industries, most companies are forced to work with the corporate titans to complete their jobs. In the software case, the last step of the shipment process is to transfer some definition of an order to UPS, USPS, FedEx, DHL, or any other large-name package carrier in order to get the "widgets" (as we so lovingly call them) delivered to their destinations. The definition of an order for any particular shipping carrier may vary, but much of the data is standardized at this point in time. However, like the oil and health industries, the method of storing and manipulating this data varies wildly from company to company.

Your basic definition of an order is one which contains a unique order number, a billing address, a shipping address, and a list of items to be shipped with their respective part numbers and other relevant information. Typically there are other pieces of data made available as well, such as the billed ship cost (useful with offers of flat-rate shipping), discount rate/percentage, shipping conditions (CoD, residential indicator, additional handling, etc.) and frequently more detailed data such as the customer number and possibly payment information. This data, while superfluous to the actual process of shipping the order, is occasionally useful to companies who want to do basic accounting or use the order data for statistical purposes.

Because there is frequently more data to an order than just that which pertains to shipping, more than just a handful of companies have sprung from the internet which provide full-scale "order management" solutions. Off the top of my head, names like MonsterCommerce, OrderMotion, NetSuite, and Yahoo! Small Business come to mind. These eCommerce solutions provide varying ways of importing, storing, displaying, and retrieving the data, and some are clearly better than others, and which ones are better depends on whether your perspective is that of a purchasing consumer or a developer. But I digress, for the moment.

The difficulty of creating shipping software comes in two forms: firstly, you must be able to successfully import and export data when interacting with a particular order management
system, and secondly you must interact with the carrier with which you are trying to ship the orders. Because the shipping carriers are used by so many thousands of companies, the methods for interacting with them are very standard and well-documented. As a result, the truly difficult aspect of the job is working with the order management systems.

Most order management systems provide the ability for clients to export and import data via a standard flat-file format, such as CSV, or XML. Frequently, order management systems provide direct methods of interaction which allow the developer to force fewer steps upon the user to ship their data. Such methods tend to allow the shipping software to directly communicate with the order management system, using a protocol like WebServices or ODBC. While ODBC tends to involve direct database queries, WebServices tend to operate using SOAP, which encodes and decodes objects into well-defined XML for language independence.

The Official NetSuite Rant

While I told myself at the advent of writing this post that I would not rag on NetSuite, I've decided to change my mind. Forgive me for lashing out as such.

Some companies, such as NetSuite, take management systems to the "next level" and attempt to produce company-wide management software which allows users to manage their accounting, orders, shipping, personnel, and funds from a single location. As one might expect, these products try so hard to accomplish everything at once, that they can fail at accomplishing any one thing well. The sad truth with products like this is that multiple development teams are required to maintain and build on the project, and metaphorically speaking the left hand has no communication with the right.

NetSuite, for customers, is likely not a bad product to work with. It has many customer-friendly features such as auto-emailing, partial order fulfillment, and online tracking. But for developers, it is a horrific black hole which will consume your man-hours and finances just to keep the product functioning. NetSuite is particularly bad at breaking version compatibility and tries to provide too many features. Many of the account-wide features/preferences within NetSuite inexplicably require or are mutually-exclusive with others, and create strange permissions or rule-breaking problems when attempting to manipulate records programmatically via server-side scripts or WebServices.

NetSuite's idealistic "golden ticket" for its customers is its ability to customize any form, field, or record in just about any way the user can imagine. Custom records and fields in NetSuite are treated as first-class citizens by the browser GUI, and can be intermingled and interchanged at will with very simple-to-use AJAX controls. The NetSuite product itself is truly a marvel, both impressive both in form and style; as stated by someone who despises the product. The truth is, if NetSuite did not attempt to integrate or "play with others" in any way, I doubt there would be many complaints to hold against them.

In the past two years working my current developer contract, I have had the pleasure of working with NetSuite almost constantly. Their development team manages to break version compatibility no less than four times a year (on average) for integration partners. I've had required fields become read-only because they were "loop holes", and I've had previously-working code completely break due to the beta of the next version having an additional required field. Of the numerous NetSuite clients we have had, most have differing "versions" of the NetSuite web application, which has convinced me that each NetSuite customer has an account on either a separate machine, or with a separate database structure. As a result, code which works flawlessly for our developer account or a particular customer may fail for everyone else using NetSuite. This version instability applies to the server-side scripts as well as the WebServies API, and almost always requries several hours of updating to bring the product solution back to a working state.

I suppose my last rant against NetSuite is its speed. The NetSuite GUI itself is a hulking AJAX beast with scripts which must load each and every time a new page, form, or record is loaded. If you wish to export data to XML or CSV, the data request goes into a queue which may take up to a half hour during peak times, regardless of the size of the result set. Also, via WebServices, any simple single request may take up to 5 minutes, and the data returned usually contains references ID's to related records, instead of including the full transaction information that you may need. Searching for records can take hours, and appears to be linear in time as compared with the size of your database.

NetSuite is likely a fine solution for small- and mid-sized companies. For large-scale shippers (more than 100 transactions a day) I highly recommend against NetSuite, as I know of a handful of NetSuite clients who process several thousand orders per day, taking hours upon hours to import their data into 3rd party applications. People at these companies have been fired for choosing NetSuite as their management system after the difficulties it has inflicted upon them, and that is a fact which should be taken lightly.

Tuesday, September 25, 2007

Starting over: How and Why

I keep trying to ask myself what I could possibly be trying to accomplish by creating a blog. I've done this-- I've done blogging. Hell, I blogged before there existed a term for it. In 1997 I had a website, and I had friends who read it, and I relished in my false sense of popularity amongst those friends. I was an idiot then, just as I am now. At least now I have the wisdom to know I'll still be an idiot tomorrow, and the common sense to try not to be an idiot right now, even if it's inevitable.

So, for the first question: why Blogger? If I wished, I could create a new website for blogging, powered by my own coding, and designed to my exact specifications; however, I could not keep it secure. One day, my server's drive would fail at the same time as the backup systems, and my human fallibility would cause a loss of this data, completely negating my entire purpose for creating it. So here I am, on Blogger.

When I was a kid, scribing my banal kid-thoughts onto the blossoming internet, I didn't realize the utility of what I was doing, nor did I realize my true motivations. I blogged back then because I insisted in my own existence; I wanted to be the focal point of not only my life, but the lives of others. I envisioned a ridiculous shrine, as my best friend had joked, dedicated to me and my awesome technological prowess, and was likely no different from any other kid then or since who has kept an online journal. Now I'm blogging for a very different reason. I don't care if this is ever popular or if anybody reads its contents. I'm just here to say what I have to say, and be done with it.

I realized recently while watching a YouTube video called The Machine Is Us/ing Us that most of us who "use the internet" really don't understand what that means, or what it could mean if we were to actually put some effort into it. The internet, to most people, is just this big headless monster of endless information that's continually growing and providing them constant amusement for the small price of a couple thousand pop-ups a day and some ad banners. Smarter folk, or at least the tech savvy tend to use empowered web browsers which are capable of blocking all but the desired content (read: no advertisements) and so they see the web in a more "pure" form, but still are only witnessing it as bystanders. Some people interact with this internet. They post on forums or play online games; they might even create a blog or share photo albums online. But that's where the interactivity stops.

In short, for most people, the internet provides two functions: sharing information, and retrieving information. But it can do more: it can also store and enhance information. For instance, my motivations for creating this Blogger blog instead of a custom one lie in the fact that Google's systematic backups will secure this data indefinitely. But, in addition, it gives me a lot of functionality for enhancing my writing. Let's say I went on a waterskiing trip (on occasion I do) and I wrote about it (I probably will); at some point it would be very possible for me to not just describe some feat I performed, but literally embed the action within the content and show you just what I can do. That's enhancement of the very content itself, and it will remain forever pristine in its quality so long as the people I chose to host this content do not fail me.