Archive for the ‘Coding’ Category

Over the First Big Hurdle – Really Nice Feeling

Wednesday, August 11th, 2010

MarketData.jpg

This afternoon I can sit back for a minute and look at what I've been doing for the past several weeks as it's gotten to the point that it's tested against data from the exchange, and it's passed those tests. It's only one of about a dozen feeds that I need to handle, but it's the first, and that means that all the infrastructure work I've done - the boost asio sockets... the serialization... the unpacking of exchange data stream... all that is done. Now it's time to put the second codec in the system and see how well it maps to the system I created for one. I'm not really convinced that the design I have now will withstand all the other sources, unmodified, but it's a really good start, and I think it's close.

So I've run this sprint to get the first data feed done, and it's done, and now I find myself exceptionally tired. No surprise there... just a matter of when not if. I've been running on this for a long time without even the slightest break, but it's done now, and I can rest for a minute and then hit it again.

Well... there's my minute's rest... time to get back at it.

Flash Player with Hardware Acceleration Arrives – 10.1.82.76

Wednesday, August 11th, 2010

This morning I saw that Adobe finally released a hardware accelerated Flash player for Mac OS X. It's version 10.1.82.76, and it works for Safari and Chrome - the two I need it to work for. I'm hoping that I don't need it too much, but it's silly to think that there won't be cases that I do need it, so it's better to be up to date and waste a tiny bit of disk space than have an old, slow, plugin.

Initial Exchange Tests are Wonderfully Successful

Tuesday, August 10th, 2010

MarketData.jpg

This afternoon I was able to finally complete the initial exchange data feed tests on my new ticker plant infrastructure. The data was from a test file the exchange provides, but sent to my UDP receiver via a little test app that we have to simulate the exchange sending the data. I was not surprised to see a few mistakes in the logic - most notably in the parsing, but that's to be expected. Once I got those pointed out, the mistakes were obvious, and the fixes were trivial.

Then it just worked. Fantastic!

The speed was nice, but when you're testing on a single box, it's not really a fair test. I'll have to wait for the two test boxes that are supposed to be provided to me, and then I'll be able to make a much more real-world test. That will be interesting.

What I need to do next is to consolidate the codebase a little - the exchanges send the same data (so they say) on two independent UDP multicast channels, and we've created a dual-headed UDP receiver. We also have a single-headed one. There's too much that's similar, and so I want to consolidate them into a multi-headed UDP receiver and have it just work for from one to, say ten, inputs. The upper limit is really arbitrary, but I can't see them doing more than this anytime soon.

Anyway, it's back to the code, and then the new hardware for the full-up speed tests.

Giving Up on “Clever” Constructor Usage – Go Simpler

Monday, August 9th, 2010

OK, I decided today to give up my clever solution to parsing these exchange messages into normalized messages. It was just too nasty. The basics seemed to work well enough, but if there were a value I wanted to set that wasn't in the exchange data feed - like which feed this was, then I had a real problem. If I used the "tag" list constructor, the value needed to be set, and the setters are protected because I want these guys to appear immutable to all the other parts of the system. So I had to make a friend relationship.

But because each of these codecs might generate any number of these normalized messages, I'd have a ton of friend statements in each class. That's just not supportable. At some point in the future, someone is going to forget to add one in, and then it's a mess as they try to figure out what's going wrong and fix it.

It's far easier to realize that each normalized message has a complete, typed, constructor, and all I need to do is to parse out the values from the exchange data stream, and then call that version of the constructor, and we're done. Nothing fancy. Not all tricky. Just plain and simple code.

While the other approach might have been nice to figure out how to skip values in the tag list, or put in functors for callbacks to the different date/time parsers for the different exchanges, it was all a bunch of mental gymnastics as it really didn't make the code any easier to read, any faster, or any more supportable. It was coder ego, and that's something I just hate to see.

So I simply cut out all the crud I'd made, and went back to a far simpler scheme, and the code looks much better for it.

Google Chrome dev 6.0.472.25 is Out

Monday, August 9th, 2010

This morning they once again updated Google Chrome dev to 6.0.472.25 with the release notes just saying "UI Updates and Security fixes." It's all fine with me, as it's easy enough to update, but you'd think they'd take even 15 seconds to enumerate a few of the UI updates, or even list one or two security fixes. But such is not the case.

Still Hammering Away at that Exchange Data

Thursday, August 5th, 2010

Today, in addition to a few meetings, I've been hard at work trying to work all the messages from one exchange data feed into my new ticker plant. The previous version of this project had over 300 messages - one per exchange message. I'm going for a far more minimalist design: if it's not a price or a trade, it's in a free-form variant message, and that's going to really help me in minimizing the number of messages people have to understand and deal with.

Yet there are always twists.

Today I realized that there are messages from the exchange that don't update their sequence number. OK, maybe they aren't critical to the function of the ticker plant, but I didn't want to throw them out at the UDP receiver. So I had to adjust the methods on my data source to allow for ignoring the sequence number checks. It made things a little more complex, but in the end, it'll be a better system.

That's where I'm at these days - taking what I think is a good idea and applying a real problem to it and seeing where it needs to stretch and fit. I'm hoping that I can get this all done in a few more days and then get to the real-world tests and verify that things are working as desired.

I've got my fingers crossed...

Google Chrome dev 6.0.472.22 is Out

Thursday, August 5th, 2010

The relentless advance of Google Chrome has this morning deposited 6.0.472.22 on my little digital doorstep. The release notes are pretty sparse:

All Platforms

  • UI Updates
  • Stability Fixes
  • (Issue 49493) Fix some problems with SSL connections through HTTP proxies.

So maybe they have the Flash problem fixed in this build? Might be interesting to try it - just to see. In any case, it's relentless, but it's nice to see the progress. It's really quite impressive that it's overtaken Firefox so quickly.

Coda Notes 1.1 is Out

Wednesday, August 4th, 2010

I got another tweet from the Panic guys that they had updated Coda Notes 1.1 - and interestingly enough, the Safari Preferences panel handles all the updates for the extensions. It was a very pleasant surprise.

Struggling With Efficient Exchange Data Decoding

Wednesday, August 4th, 2010

Today I spent a lot of time trying to come up with a really nice way to parse the exchange data. It's not as simple as it seems. I should say that it's not simple to make something that doesn't take hundreds of lines of code comprised of structs, if/then/else and switch statements.

Typically, you're going to get a message with a fixed header. In that header, the full "type" of the message will be encoded. Then you lay another struct on the message and it reveals the other fields you can pick off. With each of these messages, you could be looking at from four to ten different "patterns" and therefore structs. This makes for a lot of code to really parse out the data.

Couple that with the switch statements to know what struct to apply, and the code gets very large, very fast. One upside to this scheme is that the execution of this code is very fast. So... I wanted something that was just as fast, but was far more compact in the 'lines of code' category.

What I decided to try was a "tagging" scheme where I don't attempt to make complete sense of all the data in the exchange record, but simply indicate where each value is, and how to decode it. For example, if I create the struct:

  typedef struct {
    char       type;
    uint16_t   pos;
    uint16_t   len;
  } variable_tag_t;

where the fields are type, position and length, then I can create an array of tags that indicates where the values I need are located in the data stream:

  static variable_tag_t[]  tradeTags = {
    { 'L', 0, 10 },
    { 'S', 10, 15 },
    { 'D', 25, 8 }
  };

and I can read this: I have a long int at position 0 that's 10 characters long, a string starting at position 10 for 15 characters, and a double at position 25 for 8. It's not bad, and I can see a lot of good with this idea.

I can create constructors on the messages that take one of these arrays and the data from the exchange and use it to extract the ivars from the data. This way, the order and count of tags is fixed by the message's needs, but the location and size of each value is dictated by the specifics of the exchange.

It seems like a decent idea, but I'm going to have to make several more messages and look at a few more exchange message definitions to make sure that it's really going to work out. I certainly like the compactness of the scheme. Some will argue that it's all hard-coded numbers, and that's not good - but how much different is this than a bunch of structs? Either is a hard-coded definition of the data organization in the exchange data. This just happens to be more direct.

We'll have to see how things work out.

Building Up my C++ Variant Class

Tuesday, August 3rd, 2010

Today I spent quite a bit of time really fleshing out my variant class today. I needed to have a lot more functionality in the code as it was going to be an integral part of the ticker plant I'm working on. I needed to write a bunch of tests, and each new test uncovered either a compiler issue - like needing a new version of a method for a different use case, or a real bug in the code, which I had to fix.

Overall, it was a pretty good day, but it was all spent making the class a lot more useful to the developer that would be using it. Which, of course, is me.