To see if I could, I put together a cross communication library for .Net Core and Python applications using Boost.Interprocess, Boost.Python, and Boost.Signals2. The goal was simple, expose the same interface for cross communication to C# and Python. The approach taken was to use the condition example and edit it to expose to the different languages.
First I need to create the objects to make the interface. There are four files making up these objects:
- shm_remove.hpp – just a lifecycle object to clear the shared buffer when it is destructed
- TraceQueue.hpp – The shared memory object
- SharedMemoryConsumer.hpp – The subscriber to the shared memory data
- SharedMemoryProducer.hpp – The publisher for the shared memory data
These objects comprise the core interface of the shared memory provider. Now, the memory providers need to be exposed to multiple languages. There are different ways to do this and I decided to do it by hand. I should point out SWIG is my usual approach to this task, however, in this instance it seemed easy enough to do it by hand.
To expose the python code, I needed to create a few classes to expose the interface definitions to Boost.Python. The two classes are:
- PythonSharedMemoryConsumer.hpp – The python interface for the SharedMemoryConsumer
- PythonModule.cpp – The file that exposes the module to python
These two classes combine to expose the files to python and can be used in a python script by just importing the shared library.
With the python portion complete, I needed to expose the shared memory objects to CSharp. This is easy enough to do by hand if you expose the classes to be used by PInvoke. To accomplish this, I only needed three files:
- NetCoreSharedMemoryProducer.hpp – The .NET Core version of the publisher
- NetCoreSharedMemoryConsumer.hpp – The .NET Core version of the consumer
- NetCoreModule.cpp – The source file exposing the interfaces for PInvoke
Now we need to call that code from C# using PInvoke Interop
Another one of my talks was selected for Techbash: Alternative Device Interfaces and Machine Learning.
In this presentation, we will look at the how users interface with machines without the use of touch. These different types of interaction have their benefits and pitfalls. To showcase the power of these user interactions we will explore: Voice commands with mobile applications, Speech Recognition, and Computer Vision. After this presentation, attendees will have the knowledge to create applications that can utilize voice, video, and machine learning.
Users use voice (Alexa, Cortana, Google Now) or video as a mode of interaction with applications. More than a fad, this is a natural interface for users and is becoming more and more common with the ever-decreasing size of hardware.
Different types of interaction have their benefits and pitfalls. To showcase the power of these user interactions we will explore: Voice commands with two app types: UWP and Xamarin Forms (iOS and Android). Speech Recognition with Cognitive Services: Verifying the speaker with Speaker Recognition API. Computer Vision with Cognitive Services: Verifying a user with Face API.
By utilizing UWP, Xamarin, and Cognitive services; a device with the ultimate in customization for user interactions will be created. Come and see how!
This year I will be presenting Enable IoT with Edge Computing and Machine Learning at TechBash. Here is the outline:
Being able to run compute cycles on local hardware is a practice predating silicon circuits. Mobile and Web technology has pushed computation away from local hardware and onto remote servers. As prices in the cloud have decreased, more and more of the remote servers have moved there. This technology cycle is coming full circle with pushing the computation that would be done in the cloud down to the client. The catalyst for the cycle completing is latency and cost. Running computations on local hardware softens the load in the cloud and reduces overall cost and architectural complexity.
The difference now is how the computational logic is sent to the device. As of now, we rely on app stores and browsers to deliver the logic the client will use. Delivery mechanisms are evolving into writing code once and having the ability to run that logic in the cloud and push that logic to the client through your application and have that logic run on the device. In this presentation, we will look at how to accomplish this with existing Azure technologies and how to prepare for upcoming technologies to run these workloads.
If you get the error message “Unable to load DLL ‘e_sqlite3’ dotnet core Raspian”, that means that the libe_sqlite3.so was not loaded to the runtime directory. There is a copy of the libe_sqlite.so library here. Copy the library to the directory of the dotnet application and it should be picked up the next time the application is launched.