Upgrading the SpreadServe GUI

September 19, 2015

Recently I’ve been updating SpreadServe‘s JavaScript web GUI. The edit facility presented on the livesheet page was quite crude. It used a bootstrap-editable to pop up an edit field in a message box. Not really a seamless user experience, so I’ve upgraded to a JavaScript grid that supports in place editing. The end result is a user experience closer to Excel itself. I chose to use webismymind’s editablegrid since it can attach to an existing HTML table. In the case of SpreadServe the HTML table is generated in C++ code inside the SpreadServeEngine whenever a running spreadsheet is published to the RealTimeWebServer. I changed the C++ code to add attributes to the table and tr elements that editablegrid uses to latch on to. I made a couple of small changes to the editablegrid JavaScript so that the isEditable and modelChanged callbacks passed through more information. My isEditable implementation needed to get hold of the DOM element as well as the row column address so it could check for an ssedit attribute. And modelChanged needed the element ID so it could POST the changed data back to the RealTimeWebServer with a unique ID. The RealTimeWebServer sends the updated value back in to the SpreadServeEngine. I’ve forked editablegrid on github here with my changes. While I was doing this JS dev I found two resources very helpful: Oscar Rotero’s jQuery cheat sheet, and the Chrome debugger. I was a Firefox advocate for a long time, as Firebug was the first JavaScript debugger I used. The Chrome debugger is just faster, snappier, breakpointing is easier, and examining the DOM and variables seems better too.

Blockspring symphony

September 10, 2015

Blockspring is a cool startup that enables users to invoke web service APIs from Excel. There are ready made integrations with Amazon, Bing, Dropbox, Facebook, Github, Google, linkedin, Quandl, Slack, Twitter and many more. The beauty of Blockspring is that it normalises all of these diverse web APIs so they can be invoked from a single Excel worksheet function: =BLOCKSPRING(…) As we all know, the great strength of Excel is that it enables users who are not developers to build all kinds of solutions independently. Blockspring has dramatically extended the range of what you can do in Excel. To make a service available via =BLOCKSPRING(…) you code a ‘Block’ in Python, Ruby, JavaScript, PHP or R. The blocks are cloud hosted on Amazon servers. All well and good, but this means that you still need to be a developer to create a block. What if Excel users could implement blocks in Excel itself? To do that you’d need a cloud hosted server that can execute a spreadsheet automatically. And, of course, that’s exactly what SpreadServe does! All that’s necessary is some code for a block that can talk to a SpreadServe instance. Here’s the source on github, and here it is deployed on Blockspring. Using this SpreadServe block, a client spreadsheet can use any SpreadServe hosted spreadsheet as a web service. Here’s an example. InvestExcel‘s BlackScholes spreadsheet can calculate Call and Put prices for an option, given the usual inputs: stock and strike prices, volatility, risk free rate and tenor. Here’s that same spreadsheet deployed on an Amazon hosted SpreadServe instance, which makes it’s calculation functionality available to Blockspring client spreadsheets. This spreadsheet calculates the Put and Call prices of a series of options at different strike prices. Make sure you have Formulas/Calculation Options set to automatic when you run it. There are nine different strike prices in the series, so there are nine round trips to the back end spreadsheet, one for each call & put calculation. Try changing one of the inputs; stock or strike price. It will cause all the put and call prices to recalculate. If you point your browser at the SpreadServe host’s RealTimeWebServer while the recalculation is happening you’ll see all the inputs get pumped through, and all the outputs calculate. So there you have it: Blockspring and SpreadServe – two great tastes that taste great together!