I’m less than pleased with the verbalism “Serverless,” a bit of marketing-sprecht pitch to selling consumption-based functionality to the feckless. Not that Amazon’s “Lamda” is all that better a mouthful, but whatever the case I’d feel like less of a shill when talking about Microsoft’s lovely tech if it only had a better name. Continue reading
Category Archives: Code
Campity Do Dah
The leaves have begun to bud, the snow has started to melt, so it can only mean one thing: time for another Code Camp (2018.1). This time round I have two sessions scheduled:
Go Serverless with Azure Functions, Logic Apps and EventGrid
Azure’s serverless story makes it dead simple to decompose your clunky monolithic apps into performant DevOps-friendly microservices. Join Microsoft Cloud Solutions Architect Louis Berman as he shows you how to build and deploy a significant cloud-scale application by live-coding a real-world example of automating employee on-boarding to the Microsoft Graph as a serverless app. As a bonus he’ll also show you how to get a handle on your serverless workloads through DevOps.
Zero to DevOps (with VSTS)
DevOps is the secret sauce behind today’s most successful development teams and companies. Join Microsoft Cloud Solutions Architect Louis Berman as he shows you how to speed your race into the cloud; in many cases by as much as 10x within a single year. In this demo-heavy session Mr. Berman will demonstrate how very easy it is for every organization to adopt DevOps, but just as importantly he’ll also focus on the soft-skills needed to “sell” DevOps to your clients and peers. The session will conclude with Mr. Berman’s “Top 10 Tips for DevOps Success!”
If you’d like to get a jump on things (or if you’re reading this after 3/24/2018) you can download my decks:
- Philly Code Camp 2018.1 Zero to DevOps
- Lessons learned on Microsoft’s DevOps Journey
- Philly Code Camp 2018.1 Serverless.pptx
I also prepared a Functions demo (LsbServerless) which you can download from GitHub.
May the Serverless be with you…
Wax On, Wax Off
HTTP clients can be infuriating in that they generally work without a hiccup; until they don’t!
I recently wrote a utility to receive and then save streamed Bid/Ask data from OANDA; called OandaSink. It wasn’t rocket science—some six hundred lines in all—so I turned it on and the program didn’t skip a beat for three solid weeks. Then, for some unknowable reason, the server forced a disconnect and all of my lovely retry / reconnect logic didn’t do what it was supposed to.
Continue reading
Tickety, Tickety Tick
To develop and back-test trading algos its essential to have great gobs of historical data on hand, almost always at the tick level. More often than not this data comes from your broker—OANDA, Alpari, DukasCopy, and Integral (TrueFX), to name a popular few—whether through commercial platforms like MT4 or proprietary APIs. Alternately, one can use a generic downloader like Birt’s Tick Data Suite.
Over the years I’ve worked with more than a dozen brokers and other data providers so you think I’d have a handle on this stuff by now, but nothing could be further from the truth. No, its an ever changing and messy landscape. Continue reading
Cancel That
Cancellation in a multi-threaded Console App can be surprisingly difficult, even though I’ve done it dozens (hundreds?!?) of times before. As any programmer can tell you, there are the “Things you know” and “Things you merely think you know.” In programming, fiddly little details count.
I won’t go into the trade-offs between using Tasks or Parallel.For[Each] or TPL DataFlow, but suffice it to say that the later is both the most useful and easiest to get right. Enjoy…
using System; using System.Collections.Generic; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; namespace CancelDemo { class Program { static void Main(string[] args) { Console.WriteLine("Press any key to cancel..."); Console.WriteLine(); var cts = new CancellationTokenSource(); var client = new HttpClient(); try { var fetcher = new ActionBlock<string>( async url => { await client.GetAsync(url, cts.Token); Console.WriteLine($"FETCHED {url}"); }, new ExecutionDataflowBlockOptions() { CancellationToken = cts.Token, MaxDegreeOfParallelism = Environment.ProcessorCount }); urls.ForEach(url => fetcher.Post(url)); fetcher.Complete(); var readKey = new TaskFactory(cts.Token).StartNew(() => { while (!Console.KeyAvailable) Thread.Sleep(100); cts.Cancel(); Console.ReadKey(true); }); Task.WaitAny(new Task[] { fetcher.Completion, readKey }); } catch (OperationCanceledException) { } catch (Exception error) { cts.Cancel(); Console.WriteLine("Error: " + error.Message); } Console.WriteLine(); Console.Write("Press any key to terminate..."); Console.ReadKey(true); } private static List<string> urls = new List<string>() { "https://www.pinterest.com/pin/143270831869696811/", "https://www.pinterest.com/pin/155585362100632165/", "https://www.pinterest.com/pin/23010648069511614/", "https://www.pinterest.com/pin/303711568591359002/", "https://www.pinterest.com/pin/314900198915723688/", "https://www.pinterest.com/pin/316166836311260373/", "https://www.pinterest.com/pin/535576580657166380/", "https://www.pinterest.com/pin/56154326576327972/", "https://www.pinterest.com/pin/56154326576368600/", "https://www.pinterest.com/pin/88523948898601589/", "https://www.pinterest.com/pin/108438303498183811/", "https://www.pinterest.com/pin/127156389453876236/", "https://www.pinterest.com/pin/270708627574674608/", "https://www.pinterest.com/pin/368380444492800731/", "https://www.pinterest.com/pin/250653535491278041/", "https://www.pinterest.com/pin/565483296932119884/", "https://www.pinterest.com/pin/173177548141309276/", "https://www.pinterest.com/pin/430867889333901210/", "https://www.pinterest.com/pin/61361613645883874/", "https://www.pinterest.com/pin/16466354858074206/" }; } }
Don’t Renko; Wicko!
There are countless ways to chart price movement (interval or tick-count-based candlesticks, range-bars, Kagi, etc.) but my hands down favorite is Renko. Well, not Renko, per-se, but rather a Renko variant I like to call “Wicko.” Renkos track fixed price movements irrespective of time, which is super useful if you want to filter out noise. Unfortunately, a traditional Renko only includes Open and Close prices; not High’s and Low’s.
As to why I bothered to create my own Wicko feed (or to use the QuantConnect term: consolidator), I couldn’t find a single bug-free C# implementation even though I spent something like four hours looking. There are plenty of contenders, of course—the internet is rife, after all, with iffy code!—but each and every implementation had one or more obvious bugs. The rounding errors and lack of edge-case handling were the least of it, but the deal-breaker was the marked ignorance of gap handling.
Dare I say, my own implementation handles things beautifully, proved out by a bunch of unit tests. You can download the source from my GitHub repository.
BTW, the name Renko come from the Japanese term for bricks: renga. I’ve always liked the notion of laying down bricks on a chart, so that’s another reason to love ’em.
San Diego, Seattle, then Seattle; Oh My!!
Tis the season for peregrination, la de dah de dah, de dah, de dah. For a start I’m off to a fun-filled family reunion in sweltering San Diego (in Ramona, CA, if I’m being particular; to get that gen-u-ine desert during prolonged drought experience!) followed by two back-to-back weeklong internal Microsoft conferences in Seattle. Yes, the joys of professional development know no bounds, but if that wasn’t enough, I also get to attend a three day team offsite in Baltimore a couple of days after I get back home to Philly.
Anyway, I’m complaining overmuch because for a start (a) I love my family and (b) I’ve heard mention that this time around I get to ride my brother-in-law’s newish 1937 tractor on his “gentleman-farmer” farm, whooping it up and bellowing my trademark “Yowza” at the top of my lungs as the barely motile beast tops an eye-watering 10mph. To be sure, life doesn’t get any better!
I Need a [Web]Jobs
Once again, with the new formed buds of spring a-budding, it only natural for a young man’s thoughts turn to . . . WebJobs. OK, probably not. But this (not quite young!) man has a good reason to be thinking of such things: I’m giving a WebJobs presentation at Philly Code Camp 2016.1 later today. The session will be more than a little hands-on, but I also have a smallish deck, with a number of highlights and resource links, that you can download: Batch Processing with Azure WebJobs.
For the uninitiated, WebJobs can be thought of the newish Azure tech that (most usefully!) enables workflow for the modern web. Think image processing, shopping carts, database administration, Monte Carlo simulations, app “glue,” process control, AI, custom testing, IoT facilitation, site scraping, backups, pipelining, log ingestion and more. Even better, WebJobs are super-simple. You can be up and running in minutes, but more importantly, the “hard” stuff rarely takes more than hours.
If you work with the cloud: run, don’t walk.
GUIs can be fun (even when they’re pointless!)
Despite the fact that I went to an arts college (SUNY Purchase), founded a media company (One Source) and used to style myself an artiste (a frigging Theatrical Lighting Designer) I’ve never been a user-interface guy.