Archive for the ‘Coding’ Category

Cabel’s Amazing FancyZoom 1.1

Monday, November 7th, 2011

I remember years ago, Cabel S. writing about the nice little Javascript and graphics snip called FancyZoom that allows you to easily put thumbnail images on your web site, and then with a click, the full-size image is displayed. It's really pretty amazing. I downloaded it, and started messing with it a bit. I can understand the directory structure he chose - it's common for him, but for me, it was a little different, and that's OK fine with me. I was able to easily move things around a bit, get the links right, and it fit right into Liza's home page.

I remember it being a lot smoother back when it first came out, but now that machines and browsers are so much faster, it almost flashes up. Pretty neat, in my book. So I need to run it past Liza and see what she thinks, but I'm pretty pleased with it. What I need now is a lot of Liza's artwork and then we can get to organizing it in folders, etc. and then making thumbnails of the images, and we'll be ready to go.

I'm not sure if we'll end up needing to back-end this with a real service, but if we do, there's more than enough capability in PHP, should we need it, and I can even put up a little database to hold the information for the pages.

Pretty sweet.

Google Chrome dev 17.0.928.0 is Out

Friday, November 4th, 2011

Google Chrome

As expected, Google Chrome dev 17.0.928.0 is out, and with it are a few big ticket items: the new V8 Javascript engine is at 3.6.6.3, there are additions to the incognito windows, and several changes to the linux version to speed it up. Nice work. I read in the comments to the last release that Google is trying to make the release cycle six weeks. It's something to strive for, but I think that's a little arbitrary as there's no way to know what the next six weeks will bring, and how that will impact the ability to release significant changes to the code.

More likely, it's an arbitrary scale to just "change the numbers" and the third number, 928, is really the number to watch. Still, it's nice they are trying to have something out regularly. It's a nice goal to have.

Google Chrome dev 16.0.912.21 is Out

Wednesday, November 2nd, 2011

This morning I noticed that Google Chrome dev 16.0.912.21 was out, and while I'm still expecting 17.x any day now, it's nice to see that they are still looking into the finer points of the codebase. The release notes for this version are pretty tame - nothing amazing, but it's progress nonetheless.

Documenting the Greek Engine – OmniGraffle Pro

Monday, October 31st, 2011

I have started the documentation of some of the parts of my Greek Engine, starting with our use of redis as a cache service. This documentation is written for our QA Testers, but it ultimately needs to be translated to non-technical speak for the operations and testers folks that will come along later in the lifecycle of the project. As an additional visual aid, I started with just about the only thing I had that would make Visio-like drawings: ZeusDraw. It's OK, and I've certainly done plenty in it, but it's not the same as a real layout program like Visio on Windows, or even OmniGraffle from OmniGroup.

Still… at $200 for the Pro version - that which can read/write Visio files, it's a lot for something that I don't need all that often. Still… it's a sweet looking application. Something I would really like to have, but it's hard justifying the cost for this one project.

So I finished the first version of the block diagram of the Workspace and data feeds and realized that I needed to spend the money if I really wanted to make these look nice, and useful. So it looks like I'm going to do these over in OmniGraffle Pro as soon as we load up my PayPal account with enough money to cover the $200 the app costs from the Mac App Store.

Creating a Trade Message Accumulator (cont.)

Friday, October 28th, 2011

High-Tech Greek Engine

Today I finished up the trade message accumulator component for the Greek Engine and put it into play on the feeds from the exchanges. It's something that's been needed, and I'm hoping it's going to be able to accurately track the volume on each exchange for each instrument, but I'm not really certain that the volume numbers are all that reliable. I've seen a lot of pretty wild data from the exchanges, and I know that the prices are far more important than the sizes, and I've seen enough problems in the prices to suspect that the volumes may be accurately tracked and accumulated, but they probably aren't going to yield a really superior data stream.

It should be a lot closer, but I'm not willing to bet anything on these numbers - at least not yet.

Creating a Trade Message Accumulator

Thursday, October 27th, 2011

bug.gif

I've run into a problem with my Ticker Plant feeds, and the best solution to the problem is to create a component that can fit in-line with the feeds and "promote" and "embellish" the trade messages (prints) with the current volume traded as well as per-exchange volumes traded. The issue is that if I allow these trade messages to conflate, information about the individual trade will be lost. Sure, the most recent data will survive, but the volume change represented by the conflated trade will be gone forever.

What I needed was a very simple, very lightweight, component that would take the stream of trades and aggregate the volumes - as well as the high, low, open values, and then "attach" those values to a new trade message - one that is a subclass of the original, and so can take it's place in all the processing, but also includes this cumulative volume and limit values.

Today has been spent creating this and fixing issues associated with it. There's a lot of little things to write including the serialization and deserialization of the component, and the handling of this new message type, as well as automated tests to make sure I'm accumulating things properly. It's close, and I just need to write a few more tests, but for now they day is over and I need a break.

Google Chrome dev 16.0.912.12 is Out

Wednesday, October 26th, 2011

Google Chrome

This morning Google Chrome dev 16.0.912.12 was released and I picked it up. When I went to the release notes site, I saw that Google Chrome 15.0.874.102 was released to stable which just blows me away. That means that stable and beta are both 15.x.x.x and dev is on 16.x.x.x - that's not going to stay that way for long. I'm guessing dev is jumping to 17.x.x.x pretty soon. Additionally, there were no release notes for 16.0.912.12 at the time the code was available. So maybe it's coming sooner than later.

Always interesting times.

[10/28] UPDATE: don't blink - they just released 16.0.912.15 with typically sparse release notes. That's less than a day after the last release. Yup… it's about to jump to 17.* soon…

Creating a Solid, Reliable C++ Wrapper for hiredis Library

Tuesday, October 25th, 2011

Redis Database

Most of today has been spent trying to get my simple C++ wrapper around the hiredis C library for redis working in a way that allows for a significantly more robust usage pattern than I originally had. Specifically, all was fine until I shut off the redis server, and then my client would try to recover and reconnect and end up dumping core. The problems are only made worse by the fact that I really had no support docs on the hiredis site - only the source code, which is optimistic in the extreme. No argument checks, etc. make it ripe for a problem if it's not used exactly right.

Clearly, I wasn't using it exactly right, and those misusage patterns were what was causing the code dumps. So the first thing was to track down what I was doing wrong, and that meant that I really needed to become much more familiar with the hiredis source code. To be fair, it's a decent open source library, but it's missing so much that would have added so little to the runtime load and would have made it far more robust to the kinds of misusage patterns I had in place. After all, my code worked, so it's not that it was totally wrong, it's just that when things started to go badly, the things that you needed to do become far more important than when things are going well.

For example, if I wanted to send multiple commands to the redis server at once, you can run several redisAppendCommand() calls, but each really needs to be checked for it's return value. This isn't clear in the code, but it's very important in the actual system. Then there's the calls to redisGetReply() - typically one for each call to redisAppendCommand() - but not always. Again, you need to check for the critical REDIS_ERR_IO error that indicates that the redis context (connection object) is now so far gone that it has to be abandoned.

Then there's the reconnection logic. It's not horrible, but you have to be careful that you don't pass in any NULLs. There simply is no checking on the hiredis code to ensure that NULL arguments are skipped. It's simple to do, but it's not there - not at all.

In the end, I got something working, but it was hours of code dissection and gdb work to figure out what was going wrong and what needed to be done to handle the disconnected server and then the proper reconnection. Not fun, and several times I was wondering if it just wouldn't be easier to write my own as it's all TCP/telnet based anyway… but I kept going and in the end I have something that's reliable and solid. But it was nasty to get here.

Rounding Can Really Be a Pain in the Rump

Tuesday, October 25th, 2011

bug.gif

This morning I had a funny little bug in the Greek Engine that was really a hold-over from my Ticker Plants, regarding the creation of the security ID - the 128-bit version of the complete instrument description for use in maps, keys, etc. The problem was that the exchange codecs were correct in their work, it was the creation of the security ID that was at fault, and I needed to dig there to find the solution.

Basically, I pack the components of the instrument definition into a 128-bit unsigned integer, and to so this efficiently, I need to have a pointer that points to where the next component needs to be "dropped in". When I got to the strike, which was passed in as a double, I had the code:

  // finally, slam down the strike
  *((uint32_t *)ptr) = htonl((uint32_t)(aStrike * 1000));
  // swap the network order bytes to host order
  byteSwap();

and because of the (aStrike * 1000), I was getting 64.099 when I should have been getting 64.10, among other rounding errors. What I needed to do was pretty simple, but essential to get the right answer:

  // finally, slam down the strike
  *((uint32_t *)ptr) = htonl((uint32_t)(aStrike * 1000.0 + 0.5));
  // swap the network order bytes to host order
  byteSwap();

and with that, we got the right numbers. We even got the right thousandths place in the case of 8.125, for example. I'm sure there was partly the need to cast the 1000 into a double, but the additional movement by a half was the thing that brought it home.

Now we're OK.

Getting C++ Constructors Right is Vitally Important

Monday, October 24th, 2011

bug.gif

I ran into a problem that completely reinforces my belief that coding standards are a very good thing. And I was the culprit here - but only because I missed it, not by choice. What I had was a constructor for a Dividends set - basically dates and values in a table that needs to be treated as a single unit. The copy constructor for the instance looked like this:

  Dividends::Dividends( const Dividends & anOther )
  {
    // let the '=' operator do all the heavy lifting
    this->operator=((Dividends &)anOther);
  }

and the operator=() method looked like this:

  Dividends & Dividends::operator=( Dividends & anOther )
  {
    if (this != & anOther) {
      boost::detail::spinlock::scoped_lock   lock(mDivsMutex);
      mSetName = anOther.mSetName;
      mSecurityKey = anOther.mSecurityKey;
      mDivs = anOther.mDivs;
      mUpdateTimestamp = anOther.mUpdateTimestamp;
    }
    return *this;
  }

Now the trick here is to realize that the Boost spin lock is really just an atomic integer that they wrap with CAS operations. It's good, but it really needs to be initialized properly or it's not going to function well. What I'm doing in the copy constructor isn't wrong in the sense that it's logic is wrong, but the implementation is horrible.

When I saw this, it was clear to me what the bug was: the spin lock wasn't initialized properly, and the use of it in the operator=() method was locking the thread. Bad news. The solution was simple:

  Dividends::Dividends( const Dividends & anOther ) :
      mSetName(anOther.mSetName),
      mSecurityKey(anOther.mSecurityKey),
      mDivs(anOther.mDivs),
      mDivsMutex(),
      mUpdateTimestamp(anOther.mUpdateTimestamp)
  {
    // the initialized values do everything I need
  }

and the advantages are clear: since we're constructing a new instance, locking the new instance isn't necessary - no one knows it's there. Also, we properly initialize the mutex, and that's everything in this problem.

Standards. Get them. Live with them.