Our goal is to shrink the development workflow as much as possible without sacrificing functionality, or introducing custom syntax, overzealous patterns and extra steps into the process.
Visit the Github repo for progress and details.
The preliminary benchmark started out simple enough. In the client app, I set up a for…loop with a start/end timer to see how many requests the server app could handle within a given time period. Surprised by the results, I decided to re-tool the server app into a proper HTTP web server that could handle a GET request and return an HTTP 200 OK with “hello world” to the client. The results didn’t change much from before (still very promising) so I decided to install Node.js in Windows 7 and run a more thorough benchmark using ApacheBench, comparing against Node.js and Apache.
This is a simulated benchmark which should not be taken as a conclusive real-world test. However, the results are fascinating and worth looking into further. Continue reading
Concurrency testing started out simple enough – launch multiple instances of the client app and see how well the server can handle them all. First I used a simple DOS script that would launch 10 clients each time:
for /l %%i in (0,1,10) do (start AsyncSocketClient.exe -port 8989 -address 127.0.0.1)
Launching the client app this many times turns out to be a bad idea since each instance of the app consumes about 8 MB of memory, but even so, the server can handle 100 clients all connecting at once just fine:
Upon further review, the SendMessageToClient function or the callback in the UI thread isn’t optimized properly. A stress test has been built into the client app which creates 100 or 1000 sockets and connects them to the server immediately (no sleep), simulating a massive influx of clients. This heavy load experiment piqued my interest, so I had a look into the SendMessageToClient function to see if it could be optimized. In the callback, we are updating a listbox and textbox on the server’s UI thread. Avoiding these two updates causes the server to perform much better, and that’s fine because we can omit the Forms-based UI and simply write strings to the console, as most servers do.
We can clearly see that the server is able to handle over 10,000 connections without a hiccup:
It was my first time collaborating on a software project over the web, so I set out to design a Git workflow for the development team that would offer a good amount of flexibility.
So it seems that Microsoft has gone ahead and “done us all a favor” by having Office 2010 now save any type libraries that have been referenced in the Visual Basic Editor with the document itself to further improve compatibility between different versions of Office. What this actually ends up doing is completely breaking our VBA macros and sometimes the entire document becomes unusable on any computer running a previous version of Office.
We developed the Excel file on a computer with Office 2007, making a reference to the “Microsoft Word 12.0 Object Library” because we wanted to send some data from the Excel file out to a Word document using VBA, something like a simple “Generate Report” button. This worked and we were able to open the Excel file on computers running both Office 2007 and Office 2010, as well as generate the report.
But here’s the problem…Once the Excel file was opened then saved using Excel 2010 – without having any changes to the VBA code – the “Microsoft Word 12.0 Object Library” reference that was specifically added disappears and gets automatically replaced with a “Microsoft Word 14.0 Object Library” reference. Now when we open the Excel file on a computer with Excel 2007 it will try (and fail) to load the Word 2010 (14.0) Object Library and this results in a few serious problems:
- Opening the file in Excel 2007 is very slow and causes the program to stop responding.
- Attempting to correct the reference through the Visual Basic Editor is a no-go. The reference appears as “MISSING: Microsoft Word 14.0 Object Library” with a check mark. Attempting to clear the check to remove the reference results in an error: “Can’t perform requested operation”. Microsoft says this error happens when doing something illegal during VBA code execution, but we are simply opening the file and trying to remove the reference – we are not in break mode and no code is being executed!
Over the last couple months I’ve been developing some digital signage kiosk software for shopping malls in Southern California. One requirement of this software is that it should cycle content (advertisements, coupons, videos, etc) and provide touchscreen features (print coupons, signup for mall events) on-demand without ever being interrupted.
The kiosks should NEVER be instructed to navigate to an external website or URL because this would break the automated content cycle.
As we progressed through several development phases, what initially seemed easy – keeping the kiosk cycle running 24/7 – soon became a difficult task. We also had the problem of getting people to actually use the kiosks. Who wants to be sucked into an advertising loop anyhow? So we started adding more features in order to bring awareness and attention to the usefulness of the kiosks.
Access your files from anywhere.
If you’re like most people who have accumulated a large collection of personal photos, music, and videos on your computer at home, but wish you had access to everything whenever and wherever you are, then Nest might be for you!
Or maybe you’re a business owner who’s frequently out of the office. Install Nest on your workstation. Leave town. Open Nest on your smartphone. Start browsing your files!
Your computer + Nest = Your computer on the internet
Or to put it another way, Nest turns your computer into a “Personal Cloud“where you can access your files remotely via a web browser from almost any device, much like the new cloud music players, only you host all of your own files.
In a nutshell, Nest is…
- A remote file browser
- A remote music streamer with playlist support
- A remote image viewer with slideshow support
- A remote document viewer
Don’t allow big corporations to store and own your intellectual property!