<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://zestymeta.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://zestymeta.github.io/" rel="alternate" type="text/html" /><updated>2026-05-22T14:13:45+00:00</updated><id>https://zestymeta.github.io/feed.xml</id><title type="html">ZestyMeta</title><subtitle>A more-or-less unmaintained blog on C++ and Qt</subtitle><entry><title type="html">CMake, Qbs, and Qt</title><link href="https://zestymeta.github.io/2018/11/04/qt-cmake.html" rel="alternate" type="text/html" title="CMake, Qbs, and Qt" /><published>2018-11-04T00:00:00+00:00</published><updated>2018-11-04T00:00:00+00:00</updated><id>https://zestymeta.github.io/2018/11/04/qt-cmake</id><content type="html" xml:base="https://zestymeta.github.io/2018/11/04/qt-cmake.html"><![CDATA[<p>Last week, Qt Company announced they were <a href="http://blog.qt.io/blog/2018/10/29/deprecation-of-qbs/">deprecating Qbs</a>, and in its place would begin focusing their efforts on CMake support. It must have been a difficult call to make; a lot of time and effort has been invested into Qbs over the past 6+ years: design, implementation, support, and Qt Creator integration among others. Not to mention, any teams out there who may have invested their own time and energy into creating projects with Qbs. They now get a surprise migration project added to their plate. The general reaction on the mailing list is <a href="https://lists.qt-project.org/pipermail/development/2018-October/034023.html">pretty pissed off</a>. As for myself, I’m glad to see the project promoting CMake as their primary build system.</p>

<p>Today, <a href="http://doc.qt.io/qt-5/qmake-overview.html">qmake</a> is the official, primary build tool for Qt; for applications and framework alike. The tool generates platform appropriate Makefiles, project files for IDEs, and runs tools for code generation (supporting widget ui files, meta-object classes for QObjects, and resource files). Replacing qmake has been a long time coming, there’s probably been discussion concerning it’s potential successor longer than I’ve been programming in Qt! Almost a decade ago, there was a blog post detailing the <a href="http://blog.qt.io/blog/2009/10/12/to-make-or-not-to-make-qmake-and-beyond/">neccessary criteria</a> for <a href="http://blog.qt.io/blog/2009/10/14/to-make-or-not-to-make-qmake-and-beyond-redux/">potential replacements</a>. The main points were as follows:</p>

<ol>
  <li>Avoid a “proprietary” language
    <ul>
      <li>Promote good IDE integration</li>
      <li>Build projects directly</li>
      <li>Support for distributed build systems</li>
      <li>Support cross-compiling</li>
      <li>Support pkg-config</li>
      <li>Generate deployment packages / installers</li>
      <li>Provide configuration of projects</li>
    </ul>
  </li>
</ol>

<p>First officially introduced in early 2012, Qbs was intended to be a <a href="http://blog.qt.io/blog/2012/02/15/introducing-qbs/">replacement for qmake</a>. Introduced in the wake of QML, it naturally adopted a similar declarative Javascript syntax. Thus, satisying criteria #1. Reviewing the list of criteria, Qbs satisfied the majority of them. Over the following six years the tool continued to mature, receiving regular releases alongside the Qt framework and Qt Creator IDEs. Ask the right Qt Company developer during the annual Qt World Summit, and you may have even heard that Qbs was going to be the defacto build tool for Qt 6.</p>

<p>Meanwhile, many projects were adopting CMake as the build tool of choice. CMake is a cross-platform build system, much like qmake. First released back in 2000, it’s an open-source project, of which KitWare is perhaps the most visible contributor. The earliest mention of Qt I can find in CMake’s blog goes way back to July 2006 for the <a href="https://blog.kitware.com/cmake-2-4-2-released/">2.4.2 release</a>. The occasion for this event was KDE had chosen CMake as it’s build system, a very large, complex project to support. CMake support for Qt has continued to improve over time, to the point where it’s included in the Qt Creator IDE alongside Qbs. Anecdotally, when I encounter libraries or applications built with Qt, I find they’re built with CMake far more frequently than qmake or Qbs.</p>

<p>When we evaluated potential build tools at my current employer back in 2013, we considered the complexity of our product, community support / adoption for the build tool, and available IDE support. It was more important for a candidate to have been battle tested by large projects, than for it to be a perfect tool. While we make extensive use of Qt in our platform, there are significant portions that are vanilla, modern C++. We did not want to force non-Qt developers to deal with the additional cognitive overload of tooling / environment configuration that was irrelevant to their work. Developers focusing on areas other than the application platform wouldn’t need the additional tooling, libraries, and licenses that come with commercial Qt development. It needed to not only support Qt, but provide reasonable integration for RTI Connext DDS, and other 3rd party libraries / frameworks. The ease of generating sources from IDL in CMake was something that impressed us early on, as <a href="/2018/07/22/build-dds-with-cmake.html">demonstrated in a recent post</a>. After a short period of R&amp;D, it was quickly apparent that CMake gave us what we needed in a build system.</p>

<p>I’m pretty happy with the outcome of this bet, and I predict the Qt Project will be as well. CMake has come really far in the past five years. In particular, I’m especially proud of a build system refactor we undertook earlier this year, where adopting Modern CMake practices greatly simplified, and optimized, the development experience with our platform. Our other big dependency, RTI Connext DDS, has begun providing CMake modules out of the box, further simplifying our work. Seeing these improvements in CMake 3.0 and beyond, I suspect Qt Company realized that the community had already voted with their time, energy, and adoption of CMake. Qt Company could choose to create their own bespoke build system, or that same effort could instead be put towards continuing to push the Qt Framework forward. I’m excited to see where this change of focus leads, and look forward to building Qt without needing to bootstrap qmake.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Last week, Qt Company announced they were deprecating Qbs, and in its place would begin focusing their efforts on CMake support. It must have been a difficult call to make; a lot of time and effort has been invested into Qbs over the past 6+ years: design, implementation, support, and Qt Creator integration among others. Not to mention, any teams out there who may have invested their own time and energy into creating projects with Qbs. They now get a surprise migration project added to their plate. The general reaction on the mailing list is pretty pissed off. As for myself, I’m glad to see the project promoting CMake as their primary build system.]]></summary></entry><entry><title type="html">Building DDS Applications with CMake</title><link href="https://zestymeta.github.io/2018/07/22/build-dds-with-cmake.html" rel="alternate" type="text/html" title="Building DDS Applications with CMake" /><published>2018-07-22T00:00:00+00:00</published><updated>2018-07-22T00:00:00+00:00</updated><id>https://zestymeta.github.io/2018/07/22/build-dds-with-cmake</id><content type="html" xml:base="https://zestymeta.github.io/2018/07/22/build-dds-with-cmake.html"><![CDATA[<p><a href="/2018/07/15/bridging-qt-to-dds.html">Previously</a> we modified the example application published on Qt Company’s blog to build on Ubuntu 16.04 LTS. We then <a href="/2018/07/21/qt-rti-modern-cpp.html">migrated the examples</a> from RTI’s Traditional C++ API to the newer Modern C++ API. I’ll scratch one more itch, making use of Modern CMake to build the DDS blog examples.</p>

<p>CMake is an open-source, cross-platform family of tools designed to build, test and package software (<a href="https://cmake.org">https://cmake.org</a>). Qt has excellent <a href="https://doc.qt.io/qt-5/cmake-manual.html">support for CMake</a>, although a few holes in the documentation can make adoption a bit challenging (Presenting an opportunity for future blog posts on the topic!). Modern CMake is set of best practices that as best I can tell are documented everywhere and nowhere online. There is no single authoritative source on the subject at this time, but it’s easy to find talks and blogs that seem to come to a general consensus on the do’s and don’ts.</p>

<p>RTI provides official CMake modules, which are made available to our project via the following lines in the top-level CMakeLists.txt. This offers an immediate improvement over our hardcoded support, for a single platform, in the prior qmake project file. Complete documentation on the capabilities of these CMake modules can be found within the headers of the two cmake files at $NDDSHOME/resource/cmake.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find_package(RTIConnextDDS)
find_package(RTICodeGenerator)
</code></pre></div></div>

<p>The headers, libraries, and compile defitions are then explicitly added as dependencies to the “common” project. I’ve created this project to encompass the responsibilities of the old <code class="language-plaintext highlighter-rouge">dds.pri</code>, the generation of sources from our sensor.idl file. “common” is both project name and the name of the CMake target, a static library which will be used by all three example applications.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>target_link_libraries(common
  PUBLIC ${CONNEXTDDS_CPP2_API_LIBRARIES_RELEASE_SHARED}
)

target_include_directories(common
  PUBLIC ${PROJECT_BINARY_DIR}
  PUBLIC ${PROJECT_SOURCE_DIR}
  PUBLIC ${CONNEXTDDS_INCLUDE_DIRS}
)

target_compile_definitions(common
  PUBLIC RTI_UNIX
  PUBLIC RTI_LINUX
  PUBLIC RTI_64BIT
)
</code></pre></div></div>

<p>All of this work gets brought into the individual examples via the following. Let’s say that “example” is the project name of a Qt application. Using <code class="language-plaintext highlighter-rouge">target_link_libraries</code> we can instruct CMake to figure out what dependencies to bring along for the ride. In this case, anything marked <code class="language-plaintext highlighter-rouge">PUBLIC</code> from “common”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>target_link_libraries(example
  common
)
</code></pre></div></div>

<p>The greatest advantage to our use of CMake is the reduction from the whole of dds.pri to the following 15 lines. This can be leveraged to great effect when generating sources from multiple IDL files. Simply loop over the custom command in a macro with a list of IDL to generate the needed source files.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>set(GENERATED_SOURCES
  ${PROJECT_BINARY_DIR}/sensor.cxx
  ${PROJECT_BINARY_DIR}/sensorImpl.cxx
  ${PROJECT_BINARY_DIR}/sensorImplPlugin.cxx
 )

add_custom_command(OUTPUT ${GENERATED_SOURCES}
  COMMAND ${RTICODEGEN} -language C++11 -d ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/sensor.idl
  WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  DEPENDS ${PROJECT_SOURCE_DIR}/sensor.idl
)

set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED TRUE)

add_library(common
  ${GENERATED_SOURCES}
)
</code></pre></div></div>

<p>To build the project, we’ll assume that Qt is in your PATH. The follwing commands effectively replace <code class="language-plaintext highlighter-rouge">qmake</code> and <code class="language-plaintext highlighter-rouge">make</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmake -DCONNEXTDDS_ARCH=x64Linux3gcc5.4.0 -DCMAKE_MODULE_PATH=$NDDSHOME/resource/cmake -DRTICODEGEN_DIR=$NDDSHOME/bin .. 
cmake --build .
</code></pre></div></div>

<p>In my opinion, this results in a cleaner project view and better management of shared dependencies.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Previously we modified the example application published on Qt Company’s blog to build on Ubuntu 16.04 LTS. We then migrated the examples from RTI’s Traditional C++ API to the newer Modern C++ API. I’ll scratch one more itch, making use of Modern CMake to build the DDS blog examples.]]></summary></entry><entry><title type="html">Qt and RTI Modern C++</title><link href="https://zestymeta.github.io/2018/07/21/qt-rti-modern-cpp.html" rel="alternate" type="text/html" title="Qt and RTI Modern C++" /><published>2018-07-21T00:00:00+00:00</published><updated>2018-07-21T00:00:00+00:00</updated><id>https://zestymeta.github.io/2018/07/21/qt-rti-modern-cpp</id><content type="html" xml:base="https://zestymeta.github.io/2018/07/21/qt-rti-modern-cpp.html"><![CDATA[<p><a href="/2018/07/15/bridging-qt-to-dds.html">Previously</a> we modified the example application published on Qt Company’s blog to build on Ubuntu 16.04 LTS. Next, we will show what I believe to be an improved implementation using <a href="https://community.rti.com/static/documentation/connext-dds/5.3.1/doc/api/connext_dds/api_cpp2/index.html">RTI Connext Modern C++</a>. Although this example features RTI’s commercial implementation of DDS, both the API and on-the-wire representation of data are specified by OMG standards. The former as <a href="https://www.omg.org/spec/DDS/">DDS (Data Distribution Service)</a>, the latter <a href="https://www.omg.org/spec/DDSI-RTPS/About-DDSI-RTPS/">RTPS (Real Time Publish Subscribe)</a>.</p>

<p>As an open standard, there are a number of implementations to pick and choose from. <a href="http://opendds.org">OpenDDS</a>, available on <a href="https://github.com/objectcomputing/OpenDDS">GitHub</a>, being the easiest to get ahold of. Several commercial implementations exist by vendors such as ADLINK / PrismTech, TwinOaks Computing, and RTI. Some even offer a “community edition” for open source projects. Only small changes to the qmake project file should be neccessary to port to another DDS implementations. As such, I would encourage anyone familiar with (and having access to) these other implementations to fork the GitHub project and test this assumption.</p>

<p>The API is defined for popular languages such as Java, C, C++, C#, as well as less popular ones such as Ada. The example as written by the folks at Qt Company demonstrates what RTI calls the “Traditional C++ API”. It’s very much “C-with-classes”, throwing around pointers, getting return codes, manually allocating memory. In this blog post we will migrate the examples to the <a href="https://www.omg.org/spec/DDS-PSM-Cxx/">C++ PSM (Platform Specific Module)</a>, the characteristics of which are similar to Qt C++. Entities such as participants, publishers, subscribers are now all reference types, while the generated classes from IDL are value types.</p>

<p>To demonstrate how this all impacts application code, I’ve further modified the GitHub fork of the IoT blog example. Changes pertinent to this post can be found at the following <a href="https://github.com/ZestyMeta/qt_iot_blog_samples/releases/tag/v3.0">GitHub release</a>. The first thing you’re likely to notice, no more mucking about with pointers and memory allocation! DDS entities can be created as shown here, and passed around by reference. We can make use of retain / release, similar to Objective C / Cocoa on iOS, to keep entities around even if they fall out of scope.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const DDS_DomainId_t domainId = 0;
dds::domain::DomainParticipant participant(domainId);
if (dds::core::null == participant) {
    qDebug() &lt;&lt; "Could not create participant.";
    return -1;
}

dds::pub::Publisher publisher(participant);
if (dds::core::null == publisher) {
    qDebug() &lt;&lt; "Could not create publisher.";
    return -2;
}

std::string topic_name = "Sensor Information";
dds::topic::Topic&lt;sensor_information&gt; topic(participant, topic_name);
if (dds::core::null == topic) {
    qDebug() &lt;&lt; "Could not create topic.";
    return -3;
}

dds::pub::DataWriter&lt;sensor_information&gt; writer(publisher, topic);
if (dds::core::null == writer) {
    qDebug() &lt;&lt; "Could not create writer.";
    return -4;
}
</code></pre></div></div>

<p>Generated types on the other hand, are now treated as value types. Member variables are modified using accessor methods.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// Create real data
sensor_information sensorInformation;
sensorInformation.ID("Foobidoo");
sensorInformation.ambientTemperature(12.);
// As sensors have a unique ID, register each sensor to reuse data
dds::core::InstanceHandle sensorHandle = writer.register_instance(sensorInformation);

// Send data twice within a one second interval
writer.write(sensorInformation, sensorHandle);
</code></pre></div></div>

<p>I cheated a tiny bit here, making use of an RTI specific function. When porting to other implementations of DDS, I’m sure a <code class="language-plaintext highlighter-rouge">std::this_thread::sleep_for()</code> will suffice.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dds::core::Duration send_period{1,0};
rti::util::sleep(send_period);
</code></pre></div></div>

<p>Another nice quality of life improvement, generated types implement the stream operator, such that you can cout the contents of a sample. In the case of the blog example, this simplified the qDebug() portion.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>QDebug operator&lt;&lt;(QDebug d, const sensor_information &amp;sensor)
{
    std::ostringstream stream;
    stream &lt;&lt; sensor;

    d &lt;&lt; "Sensor( " &lt;&lt; QString::fromStdString(stream.str()) &lt;&lt; ")";
    return d;
}
</code></pre></div></div>

<p>When it came to modifying the QML example, I skipped implementing error checking for the sake of showing a greatly simplified initialization. A 50 line init method is replaced by 6 additional lines in the constructor. In production code, it would be desirable to test created entities against <code class="language-plaintext highlighter-rouge">dds::core::null</code> to see if they were succesfully constructed. Though not demonstrated here, the Modern C++ API will now also throw exceptions for certain illegal operations. I leave it as an exercise to the reader to investigate the <a href="https://community.rti.com/static/documentation/connext-dds/5.3.0/doc/api/connext_dds/api_cpp2/group__DDSException.html">relevant documentation</a>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SensorInformation::SensorInformation(QObject *parent) :
    QObject(parent),
    m_participant(domainId),
    m_publisher(m_participant),
    m_topic(m_participant, "Sensor Information"),
    m_writer(m_publisher, m_topic)
{
    // Create real data
    m_id = QUuid::createUuid().toString().mid(1, 8);
    m_info.ID(m_id.toStdString());
}
</code></pre></div></div>

<p>I think you’ll agree the migrated application code is not only an easier read, but far less risky to implement. If you have time, pull down the code and give it a go. It works on my machine, as the tired refrain goes. Having demonstrated the RTI Modern C++ API, aka DDS PSM C++, I’ve got one more post and code change I’d like to make before leaving well enough alone.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Previously we modified the example application published on Qt Company’s blog to build on Ubuntu 16.04 LTS. Next, we will show what I believe to be an improved implementation using RTI Connext Modern C++. Although this example features RTI’s commercial implementation of DDS, both the API and on-the-wire representation of data are specified by OMG standards. The former as DDS (Data Distribution Service), the latter RTPS (Real Time Publish Subscribe).]]></summary></entry><entry><title type="html">Bridging Qt to DDS</title><link href="https://zestymeta.github.io/2018/07/15/bridging-qt-to-dds.html" rel="alternate" type="text/html" title="Bridging Qt to DDS" /><published>2018-07-15T00:00:00+00:00</published><updated>2018-07-15T00:00:00+00:00</updated><id>https://zestymeta.github.io/2018/07/15/bridging-qt-to-dds</id><content type="html" xml:base="https://zestymeta.github.io/2018/07/15/bridging-qt-to-dds.html"><![CDATA[<p>Qt Company has been publishing an <a href="https://blog.qt.io/posts/2018/05/09/qt-automation-blog-series/">Automation blog series</a> on the various protocols that can bring Qt applications into the world of IoT. Of interest to me, they <a href="https://blog.qt.io/posts/2018/06/06/building-bridge-qt-dds/">published a blog</a> demonstrating Qt applications publishing and subscribing sensor data. I’d like to expand on this example, having done prior work integrating Qt and DDS. I’ve <a href="https://github.com/ZestyMeta/qt_iot_blog_samples/">forked the GitHub project</a>, and will document the various changes I make. Beginning with the basics: getting the project compiled and running.</p>

<p>The <a href="https://github.com/ZestyMeta/qt_iot_blog_samples/tree/v2.0/part3">release linked here</a> should succesfully compile and run in Ubuntu 16.04 LTS. By convention, all DDS libraries / headers are located in a path relative to the NDDSHOME environment variable. As such, the qmake project files were edited to accomodate the various path and filename changes.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>RTIDDS_PREFIX = $$(NDDSHOME)
RTIDDS_VERSION = x64Linux3gcc5.4.0
</code></pre></div></div>

<p>The library names also required some editing. Note that the library names end with a ‘d’ suffix, indicating we’re linking to the shared, debug libraries. This is an area for potential improvement in future iterations.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>LIBS += -L$${RTIDDS_PREFIX}/lib/$${RTIDDS_VERSION} -lnddscd -lnddscppd -lnddscored
</code></pre></div></div>

<p>In Linux we require several definitions to keep the compiler happy. That last one must be swapped out in order to build a 32 bit binary, but as I’m running this on a modern desktop I’m not too worried about it.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DEFINES += RTI_UNIX RTI_LINUX RTI_64BIT
</code></pre></div></div>

<p>The original example was running the latest Qt release (5.11), while I’m back a few releases in stability land with Qt 5.9 LTS. To get the application running I cranked down the version numbers on several of the imports.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2
</code></pre></div></div>

<p>One last item requiring change: the commands for generating IDL sources caused <code class="language-plaintext highlighter-rouge">make</code> to fail. As an example, the original line looked like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ddsplugingen.commands = echo "Additional Source(Plugin): ${QMAKE_FILE_NAME}"
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">(</code> <code class="language-plaintext highlighter-rouge">)</code> around <code class="language-plaintext highlighter-rouge">Plugin</code> caused <code class="language-plaintext highlighter-rouge">/bin/sh</code> to exit, requiring us to either escape or remove the offending characters.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ddsplugingen.commands = echo "Additional Source Plugin: ${QMAKE_FILE_NAME}"
</code></pre></div></div>

<p>With these minor changes, the examples succesfully compile and run in Ubuntu 16.04 LTS! Having established a baseline for development, we can move onto more exciting changes in future blog posts.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Qt Company has been publishing an Automation blog series on the various protocols that can bring Qt applications into the world of IoT. Of interest to me, they published a blog demonstrating Qt applications publishing and subscribing sensor data. I’d like to expand on this example, having done prior work integrating Qt and DDS. I’ve forked the GitHub project, and will document the various changes I make. Beginning with the basics: getting the project compiled and running.]]></summary></entry><entry><title type="html">Qt World Summit 2017</title><link href="https://zestymeta.github.io/2017/10/15/qtws2017.html" rel="alternate" type="text/html" title="Qt World Summit 2017" /><published>2017-10-15T00:00:00+00:00</published><updated>2017-10-15T00:00:00+00:00</updated><id>https://zestymeta.github.io/2017/10/15/qtws2017</id><content type="html" xml:base="https://zestymeta.github.io/2017/10/15/qtws2017.html"><![CDATA[<p>This past week I attended <a href="https://www.qtworldsummit.com">Qt World Summit</a> in Berlin, an annual event bringing together folks using the Qt framework; three days of sessions covering technical and business topics. I first attended in 2009, back when it was called Qt Developer Days, then again in 2010, 2012, and 2016. All four times were in San Fransisco, making this one particularly special. It’s been heartening to see the event grow in attendance over the years, alongside an increasing breadth of topics and depth of content. Back in 2009 Qt was primarily seen as a desktop application framework, though the then-recent acquistion of Trolltech by Nokia was a sign of change to come. In contrast, last week’s event brought together folks working on mobile apps, automotive dashboards, manufacturing equipment, medical devices, game engines, home automation (IoT), and virtual reality.</p>

<p>My own contribution to this event came in the form of a talk on <a href="https://www.qtworldsummit.com/sessions/building-human-machine-interface-medical-iot/">Building a Human Machine Interface for the Medical IoT</a>. Enough folks submitted talk abstracts for Qt in medical that we effectively got our own session track in room A05 on the second day. It was great to have an audience of folks already invested in the medical space, and at least from my view up front the talk seemed well received. The talk covered the basics of the medical IoT platform we’re creating, and into all the ways we’re using Qt to create clinical apps for the Hospital, as well as how we’re extending the framework to support novel features.</p>

<p>I’ve uploaded the <a href="https://speakerdeck.com/zestymeta/building-an-hmi-for-the-medical-iot">slide deck</a>. My thanks to DocBox for sponsoring the trip out to Berlin, and my wife for lending me out for the week.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This past week I attended Qt World Summit in Berlin, an annual event bringing together folks using the Qt framework; three days of sessions covering technical and business topics. I first attended in 2009, back when it was called Qt Developer Days, then again in 2010, 2012, and 2016. All four times were in San Fransisco, making this one particularly special. It’s been heartening to see the event grow in attendance over the years, alongside an increasing breadth of topics and depth of content. Back in 2009 Qt was primarily seen as a desktop application framework, though the then-recent acquistion of Trolltech by Nokia was a sign of change to come. In contrast, last week’s event brought together folks working on mobile apps, automotive dashboards, manufacturing equipment, medical devices, game engines, home automation (IoT), and virtual reality.]]></summary></entry><entry><title type="html">Vermont Code Camp 2017</title><link href="https://zestymeta.github.io/2017/09/23/vtcc2017.html" rel="alternate" type="text/html" title="Vermont Code Camp 2017" /><published>2017-09-23T00:00:00+00:00</published><updated>2017-09-23T00:00:00+00:00</updated><id>https://zestymeta.github.io/2017/09/23/vtcc2017</id><content type="html" xml:base="https://zestymeta.github.io/2017/09/23/vtcc2017.html"><![CDATA[<p>I recently had the opportunity to speak at the 2017 <a href="https://www.vtcodecamp.org">Vermont Code Camp (VTCC)</a>. The first three (or four?) of these I was still living in BTV, and was able to attend. By the third VTCC I began mulling over doing a talk concerning Qt (Widgets) for desktop application development, but before long I had moved down to Boston, and never submitted it. After four years living the stealth-mode startup lifestyle, I got a bit stir crazy and went looking for ways to get out in public to talk about the stuff we’ve been working on. VTCC represented a chance to speak on technical topics, but also a great excuse to drive up to Vermont for a weekend in the fall! The talk proposal for 2017 went something like…</p>

<blockquote>

  <p>Using the Ubuntu GNU/Linux distribution and Qt application framework, we will demonstrate a theoretical app platform for an IIoT device. This theoretical app platform will be modeled after production systems using open source software in the automotive and medical industries. We’ll explore the rationale for creating such a platform, then briefly introduce the Qt application framework, and create an example app from scratch. Finally, we will package and deploy this app to our theoretical device for a live demo.</p>

</blockquote>

<p>The demo code for the system UI and demo application can (soon) be found at my <a href="https://github.com/ZestyMeta/VTCC2017">VTCC 2017 GitHub repo</a>. The <a href="https://speakerdeck.com/zestymeta/qt-plus-ubuntu">slide deck</a> is also available online.</p>

<p>I’m happy to announce that in addition to the VTCC talk, I will be speaking at the <a href="https://www.qtworldsummit.com">Qt World Summit</a> in Berlin, Germany!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I recently had the opportunity to speak at the 2017 Vermont Code Camp (VTCC). The first three (or four?) of these I was still living in BTV, and was able to attend. By the third VTCC I began mulling over doing a talk concerning Qt (Widgets) for desktop application development, but before long I had moved down to Boston, and never submitted it. After four years living the stealth-mode startup lifestyle, I got a bit stir crazy and went looking for ways to get out in public to talk about the stuff we’ve been working on. VTCC represented a chance to speak on technical topics, but also a great excuse to drive up to Vermont for a weekend in the fall! The talk proposal for 2017 went something like…]]></summary></entry></feed>