<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Plugins &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/plugins/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Tue, 25 Feb 2025 21:38:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Build a Xojo Plugin with GitHub Actions</title>
		<link>https://blog.xojo.com/2025/02/25/build-a-xojo-plugin-with-github-actions/</link>
		
		<dc:creator><![CDATA[Jürg Otter]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 22:30:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[#YearofCode]]></category>
		<category><![CDATA[cubeSQL]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Year of Code]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14509</guid>

					<description><![CDATA[As part of Xojo&#8217;s 2025 Year of Code initiative, February&#8217;s theme is databases—a perfect fit for my recent work on the Open Source CubeSQLPlugin. This&#8230;]]></description>
										<content:encoded><![CDATA[
<p>As part of <a href="https://forum.xojo.com/t/2025-year-of-code-february/" target="_blank" rel="noreferrer noopener">Xojo&#8217;s 2025 Year of Code</a> initiative, <a href="https://forum.xojo.com/t/2025-year-of-code-february/" target="_blank" rel="noreferrer noopener">February&#8217;s theme is databases</a>—a perfect fit for my recent work on the <a href="https://github.com/marcobambini/cubesqlplugin" target="_blank" rel="noreferrer noopener">Open Source CubeSQLPlugin</a>. This article shares insights into automating its build process with <a href="https://docs.github.com/en/actions/writing-workflows" target="_blank" rel="noreferrer noopener">GitHub Actions Workflows</a>.</p>



<p>Xojo plugins are add-ons that extend the functionality of the Xojo development environment, allowing developers to add additional features, integrate third-party libraries, and much more.</p>



<h2 class="wp-block-heading">Write a Xojo Plugin</h2>



<p>This article assumes familiarity with the <a href="https://documentation.xojo.com/topics/custom_controls/plugins_sdk.html" target="_blank" rel="noreferrer noopener">Xojo Plugin SDK</a> and focuses on automating plugin builds. If you&#8217;re new to plugin development, check out the resources in Xojo’s &#8220;Extras&#8221; folder, YouTube tutorials, and the Xojo Forum.</p>



<p>It builds on my previous blog post <a href="https://blog.xojo.com/2022/10/19/xojo-github-actions/" target="_blank" rel="noreferrer noopener">Xojo Github Actions</a> and involves <a href="https://www.docker.com/" target="_blank" rel="noreferrer noopener">Docker</a>, which has also been a part of a previous blog posts (<a href="https://blog.xojo.com/2024/06/03/docker-database-servers-and-xojo/" target="_blank" rel="noreferrer noopener">Docker, Database Servers and Xojo</a>, <a href="https://blog.xojo.com/2021/05/17/running-xojo-web-applications-in-docker/" target="_blank" rel="noreferrer noopener">Running Xojo Web Applications in Docker</a>). So read up there on what a <a href="https://docs.github.com/en/actions/writing-workflows" target="_blank" rel="noreferrer noopener">GitHub Actions workflow</a> is, what the <code>.yaml</code> files in the Folder <code>.github/workflows</code> are used for.</p>



<h2 class="wp-block-heading"><strong>Build a Xojo Plugin</strong></h2>



<p>Since Xojo is a cross platform development environment, a Xojo plugin needs to be built for all the supported platforms <em>(Windows, macOS, Linux)</em> and all their architectures <em>(Intel/ARM, 32/64Bit)</em>.</p>



<p>All the plugin parts (the Windows <code>.dll</code>&#8216;s, .macOS <code>.dylib</code>&#8216;s and Linux <code>.so</code>&#8216;s) are being packaged into a <code>.xojo_plugin</code> file.</p>



<p>One of the challenges is to have an environment to build all that. At the first glance it seems that one would need a Mac, a Windows machine &#8211; as well as some Linux environment <em>(any of which could also just be a virtual machine)</em>. And one would first think that there will be a lot of manual steps involved &#8211; building the plugin source on various machines, copying all the built plugin parts together to finally assemble the resulting <code>.xojo_plugin</code>.</p>



<p>However &#8211; all that is not required. You can build a Xojo plugin without your own machine being involved, fully automated. GitHub Actions provides all we need.</p>



<h2 class="wp-block-heading"><strong>Example: CubeSQLPlugin</strong></h2>



<p>Let us have a look at this existing <a href="https://github.com/marcobambini/cubesqlplugin" target="_blank" rel="noreferrer noopener">Open Source Plugin</a>.</p>



<p><a href="https://github.com/marcobambini/cubesqlplugin" target="_blank" rel="noreferrer noopener"><em>CubeSQLPlugin</em></a><em> is an extension for the Xojo programming environment that allows developers to use </em><a href="https://sqlabs.com/cubesql" target="_blank" rel="noreferrer noopener"><em>CubeSQL</em></a><em>, a fully featured and high performance relational database management system built on top of the SQLite database engine.</em></p>



<p>The plugin is being used in the Open Sourced Administrations Tools for CubeSQL, which are both written in Xojo: <a href="https://github.com/cubesql/webadmin" target="_blank" rel="noreferrer noopener">CubeSQL Web Admin</a> and <a href="https://github.com/cubesql/cubeSQLAdmin" target="_blank" rel="noreferrer noopener">CubeSQL (Desktop) Admin</a>.</p>



<p>Internally the plugin uses <a href="https://www.libressl.org" target="_blank" rel="noreferrer noopener">LibreSSL</a> for TLS Connections of Database Clients to CubeSQL Server. This means that first the LibreSSL libs need to be built for all build targets. Only then can the plugin source be built again for all build targets. And finally, all the plugin parts need to be assembled into the Xojo plugin structure for the final <code>.xojo_plugin</code>.</p>



<p>We have automated the whole build process of the plugin using <a href="https://docs.github.com/de/actions" target="_blank" rel="noreferrer noopener">GitHub Actions</a> by having created three workflows. You&#8217;ll find their source in the folder <a href="https://github.com/marcobambini/cubesqlplugin/tree/master/.github/workflows" target="_blank" rel="noreferrer noopener">.github/workflows</a>. All workflow executions you&#8217;ll find on GitHub in the tab named <a href="https://github.com/marcobambini/cubesqlplugin/actions" target="_blank" rel="noreferrer noopener">Actions</a> <em>(as long as they have not been deleted or removed)</em>.</p>



<p><strong>LibreSSL</strong><br>This workflow will download the <a href="https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/" target="_blank" rel="noreferrer noopener">LibreSSL Source</a>, and build it for all needed build targets. It needs to be run only once, e.g. if a new <a href="https://www.libressl.org" target="_blank" rel="noreferrer noopener">LibreSSL</a> version is available that should be included for the next plugin build. That&#8217;s why it&#8217;s a workflow that can be run manually. It asks which LibreSSL version should be built and whether the built libraries should be committed and pushed to the repository.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="367" src="https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-1024x367.png" alt="" class="wp-image-14514" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-1024x367.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-300x108.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-768x276.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-1536x551.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/01_Workflow_LibreSSL-2048x735.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>CubeSQLPlugin</strong><br>This workflow will build the <a href="https://github.com/marcobambini/cubesqlplugin" target="_blank" rel="noreferrer noopener">CubeSQL Xojo Plugin</a> for all build targets using the currently committed LibreSSL libs in the repository. It will commit and push all the built <code>.dll</code>&#8216;s, .<code>dylib</code>&#8216;s and <code>.so</code>&#8216;s to the repository.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="496" src="https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-1024x496.png" alt="" class="wp-image-14515" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-1024x496.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-300x145.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-768x372.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-1536x744.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/02_Workflow-Plugin-2048x992.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Create Release</strong><br>That one is pretty obvious, right? It builds the structure of the final <code>.xojo_plugin</code> and creates a new <a href="https://github.com/marcobambini/cubesqlplugin/releases" target="_blank" rel="noreferrer noopener">Release</a> in the repository with the final Xojo plugin &#8211; ready to be downloaded.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="535" src="https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-1024x535.png" alt="" class="wp-image-14516" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-1024x535.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-300x157.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-768x401.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-1536x802.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/03_Plugin-Release-2048x1069.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading"><strong>Build for all Platforms and Architectures</strong></h3>



<p>The two workflows &#8220;LibreSSL&#8221; and &#8220;CubeSQLPlugin&#8221; are similar in their approach to building for all the supported platforms <em>(Windows, macOS, Linux)</em> and all their architectures <em>(Intel/ARM, 32/64Bit)</em>.</p>



<p>GitHub offers hosted <a href="https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners" target="_blank" rel="noreferrer noopener">virtual machines to run workflows</a>. All virtual machines contain an environment of tools, packages, and settings available for <a href="https://docs.github.com/en/actions/writing-workflows" target="_blank" rel="noreferrer noopener">GitHub Actions workflows</a> to use.</p>



<p>So our workflows can simply use these environments. The workflows consist of several steps, each of which can be executed on a different runner. Remember that I&#8217;ve written: &#8220;You can build a Xojo plugin without your own machine involved&#8221;?</p>



<p>In the following ScreenShot we&#8217;re seeing that the Linux-ARM64 plugin part is being created on a Ubuntu 24.04.1 ARM machine.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="475" src="https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-1024x475.png" alt="" class="wp-image-14517" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-1024x475.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-300x139.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-768x356.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-1536x712.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/04_Build-Linux-ARM64-2048x949.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>macOS</strong></h4>



<ul class="wp-block-list">
<li>Runs on a GitHub macOS virtual machine.</li>



<li>Uses the preinstalled Xcode command line tools to build &#8220;Intel x86_64&#8221; and &#8220;ARM64&#8221; and combine the two to a universal binary.</li>



<li>CodeSigns with credentials added as repository secrets.</li>
</ul>



<h4 class="wp-block-heading"><strong>Linux</strong></h4>



<ul class="wp-block-list">
<li>ARM32, ARM64
<ul class="wp-block-list">
<li>Runs on a GitHub Linux virtual ARM machine.</li>



<li>To always have exactly the same build toolset <em>(e.g. so that it doesn&#8217;t matter if GitHub updates to a newer Ubuntu version)</em> it leverages a Docker container (e.g. <a href="https://hub.docker.com/r/arm64v8/gcc/" target="_blank" rel="noreferrer noopener">arm64v8/gcc</a>) &#8211; and actually builds the source inside the Docker container.</li>
</ul>
</li>



<li>i386, x86_64
<ul class="wp-block-list">
<li>Runs on a GitHub Linux virtual Intel machine.</li>



<li>Also uses a <a href="https://hub.docker.com/_/gcc" target="_blank" rel="noreferrer noopener">gcc Docker Image</a> to build the source.</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading"><strong>Windows</strong></h4>



<ul class="wp-block-list">
<li>Runs on a GitHub Windows virtual machine.</li>



<li>Uses the preinstalled Visual Studio environment to build all &#8220;win32&#8221;, &#8220;x64&#8221; and &#8220;ARM64&#8221;.</li>
</ul>



<h2 class="wp-block-heading"><strong>How to Build your Xojo Plugin</strong></h2>



<p>I&#8217;m very well aware that this article can&#8217;t help you build your plugin. Each one is individual and needs its own steps and processes.</p>



<p>However, should you consider automating your plugin build process. You might want to look in more detail in the open-source plugin source and the <a href="https://github.com/marcobambini/cubesqlplugin/tree/master/.github/workflows" target="_blank" rel="noreferrer noopener">workflows</a> which are building <a href="https://github.com/marcobambini/cubesqlplugin" target="_blank" rel="noreferrer noopener">CubeSQLPlugin</a> for all required targets and architectures.</p>



<h2 class="wp-block-heading"><strong>How to Transition from Manual to Automated</strong></h2>



<p>While creating a plugin, one doesn&#8217;t think of its build process in the early stages, maybe not even for the first few released versions.&nbsp;</p>



<p>Plugin building is usually a manual process, requiring manual execution of a lot of steps and commands on various machines. It is tedious and prone to errors. It takes time, which adds up the more you build. There&#8217;s a point when one should think about streamlining and automate the process, allowing for building new versions without too much effort.<br>In addition, it&#8217;s certainly a good idea to have a consistent build environment other than your own development machine as you could install and change things on there which could impact the builds. That&#8217;s why building inside a Docker container is an interesting approach &#8211; it will remain exactly the same each and every time, even if the host machine is changed <em>(e.g. by being updated to a new operating system version)</em>.</p>



<p>All that used to be like that before having written the GitHub workflow.</p>



<p>How can you transition from a manual to an automated process for your own project? I won&#8217;t be able to provide all answers. But, I&#8217;d like to give a few ideas of possible steps, with no intention of them being complete or the best choice for your project.</p>



<ul class="wp-block-list">
<li>Use a version control system.
<ul class="wp-block-list">
<li>Git and GitHub are (for many use cases) free.</li>



<li>Using a Cloud solution serves as a backup should something happen to your machines.</li>



<li>You can additionally benefit from other services such as the GitHub Actions workflows mentioned in this article.</li>
</ul>
</li>



<li>Everything that is only in your head should go into some written form. Once you don&#8217;t need to do something for some time, you might forget or miss something.
<ul class="wp-block-list">
<li>Start with documenting all steps, commands, and actions.</li>
</ul>
</li>



<li>Try to get rid of manual steps. Are you copy-and-pasting several commands to a terminal each and every time?
<ul class="wp-block-list">
<li>Put them in a shell script, so that you only need to run one command.</li>



<li>You can use these scripts later when going to a fully-automated system.</li>
</ul>
</li>



<li>When initial development is finished and you&#8217;re ready to release:
<ul class="wp-block-list">
<li>Don&#8217;t do releases from your development machine. It might be defunct, broken, stolen, or you&#8217;re installing some new cool stuff and suddenly notice issues with other projects. Having a dedicated build machine is one idea. </li>



<li>Another is going the &#8220;GitHub Actions&#8221; way which also has its benefits.
<ul class="wp-block-list">
<li>Runners are virtual machines that are provisioned and &#8220;fresh&#8221; every time. It&#8217;s always the very same environment to start with for each build, no matter what you&#8217;re doing during a build.</li>



<li>You don&#8217;t need to maintain many different build machines yourself. This can even solve some security issues, as it&#8217;s probably not your main interest of keeping everything up to date. I prefer to focus on programming and not on system maintenance.</li>



<li>However, the runners might be outdated in a few years &#8211; and new runners (with newer operating systems) will be available.
<ul class="wp-block-list">
<li>That&#8217;s usually not a very big issue on macOS and Windows since their build tools are usually backwards compatible for quite a long time.</li>



<li>Especially for Linux we have decided not to rely on the provided host but use a Docker Image and run the builds inside a Docker container. So you can, for example, use a Docker container with an image that perfectly fits your lowest compatibility needs, while the host itself might only have (too) new libraries installed.</li>
</ul>
</li>
</ul>
</li>



<li>Start putting all your steps and scripts into a workflow &#8211; be it just on your dedicated build environment, or using GitHub Actions.
<ul class="wp-block-list">
<li>Certainly separate them per required host (macOS / Windows / Linux).</li>



<li>Split a long script into smaller parts, e.g: Download LibreSSL, Build x86_64, Build arm64, Build Universal.
<ul class="wp-block-list">
<li>In case of an error, it&#8217;s easier to see that &#8220;macOS: Build arm64 has failed&#8221;, compared to &#8220;Build for macOS has failed&#8221; (because it&#8217;s all in a lengthy script).</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>



<li>Running the workflows manually is great and likely more than good enough.<br>Once the project activity grows (e.g. you&#8217;re receiving a lot of pull request or have many developers working on it):
<ul class="wp-block-list">
<li>Ensure that the build and test workflows are running on each pull request, require them to complete successfully before being able to merge. That by the way has been explained in the previous blog post <a href="https://blog.xojo.com/2022/10/19/xojo-github-actions/">Xojo GitHub Actions</a>. After all, no one wants to find out after many commits that the build is no longer working, and then have to search the history for what might have caused the problem.</li>
</ul>
</li>



<li>You&#8217;ll notice that once it&#8217;s all automated you no longer miss it. It causes no additional effort for you, instead bringing a lot of benefits <em>(such as noticing early when code changes cause oddities in tests and builds)</em>.</li>
</ul>



<h3 class="wp-block-heading"><strong>A Fun Fact</strong></h3>



<p>In the early days a build of the CubeSQLPlugin often took a couple of hours &#8211; and with personal attention needed so that one couldn&#8217;t work on much else during that time.</p>



<p>The first iteration of the workflows reduced the entire build (LibreSSL + Plugin) to about 25 minutes. With no attention and manual interaction needed &#8211; which means more time for other work. What took the longest was the LibreSSL ARM builds &#8211; they have been run on Intel hardware with QEMU for ARM emulation.</p>



<p>Back to the beginning of this article and <a href="https://forum.xojo.com/t/2025-year-of-code-february/" target="_blank" rel="noreferrer noopener">Xojo&#8217;s 2025 Year of Code</a> initiative &#8211; in February I have improved the workflows to use the newly available GitHub Actions runners that run on ARM hardware. Which means that no more emulation is required &#8211; and the build time has now come down to about 4 minutes for LibreSSL Libs <em>(required only once per new LibreSSL version)</em> and 2.5 minutes for the Xojo database plugin for all its supported platforms and architectures!</p>



<h2 class="wp-block-heading"><strong>That&#8217;s All Folks!</strong></h2>



<p>I hope this brief introduction of how to use <a href="https://docs.github.com/en/actions/writing-workflows" target="_blank" rel="noreferrer noopener">GitHub Actions workflows</a> and <a href="https://www.docker.com" target="_blank" rel="noreferrer noopener">Docker</a> to build a <a href="https://documentation.xojo.com/topics/custom_controls/plugins_sdk.html" target="_blank" rel="noreferrer noopener">Xojo plugin</a> has been helpful to some, food for thought to others.</p>



<p><em><em>Jürg Otter is a long term user of Xojo and working for </em><a href="https://www.cmiag.ch/"><em>CM Informatik AG</em></a><em>. Their Application </em><a href="https://cmi-bildung.ch/"><em>CMI LehrerOffice</em></a><em> is a Xojo Design Award Winner 2018. In his leisure time Jürg provides some </em><a href="https://www.jo-tools.ch/xojo/"><em>bits and pieces for Xojo Developers</em></a><em>.</em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2020 Xojo Design Award Winners</title>
		<link>https://blog.xojo.com/2020/03/13/2020-xojo-design-award-winners/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Fri, 13 Mar 2020 16:36:44 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[XDC]]></category>
		<category><![CDATA[XOJO.CONNECT]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Awards]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Vertical Market]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=6748</guid>

					<description><![CDATA[Today we are pleased to announce the winners of the 2020 Xojo Design Awards. Judging is never an easy job, but this year the submissions were such a diverse range of apps we found it both exciting and difficult! The Design Awards honor excellence in software design. These awards are a great opportunity to learn about some of the best apps made with Xojo. Support Xojo and the Xojo community by sharing and congratulating these winners!]]></description>
										<content:encoded><![CDATA[
<p>Today we are pleased to announce the winners of the 2020&nbsp;<a href="https://www.xojo.com/designawards/">Xojo Design Awards</a>. Judging is never an easy job, but this year the submissions were such a diverse range of apps we found it both exciting and difficult! The Design Awards honor excellence in software design in the following categories: Best Consumer App, Best iOS App, Best Lifestyle App, Best Developer Tool, Best Vertical Market Apps and Best Plugin. These awards are a great opportunity to learn about some of the best apps made with Xojo. Support Xojo and the Xojo community by sharing and congratulating these winners!</p>



<h3 class="wp-block-heading">The 2020 Xojo Design Award Winners are:</h3>



<h4 class="wp-block-heading">Best Consumer App &#8211; HDRtist NX</h4>



<p><a href="https://www.ohanaware.com">Ohanaware</a>: A detail-oriented High Dynamic Range Imaging app for MacOS X.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="510" src="https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist-1024x510.png" alt="" class="wp-image-6755" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist-1024x510.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist-300x149.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist-768x382.png 768w, https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist-1536x765.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/03/hdrtist.png 2040w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></div>



<h4 class="wp-block-heading">Best iOS App &#8211; PropertyMe Manager</h4>



<p><a href="https://apps.apple.com/au/app/propertyme-manager/id936934755">PropertyMe</a>: The PropertyMe Manager app gives property managers access to their portfolio wherever they are.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2020/03/propertyme.gif" alt="" class="wp-image-6756" width="234" height="506"/></figure></div>



<h4 class="wp-block-heading">Best Lifestyle App &#8211; Crossword Wizard</h4>



<p><a href="https://www.crosswordwizard.com.au">Rush Software</a>: Create and play crossword games.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="719" height="507" src="https://blog.xojo.com/wp-content/uploads/2020/03/crosswordwizard.jpg" alt="" class="wp-image-6758" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/crosswordwizard.jpg 719w, https://blog.xojo.com/wp-content/uploads/2020/03/crosswordwizard-300x212.jpg 300w" sizes="auto, (max-width: 719px) 100vw, 719px" /></figure></div>



<h4 class="wp-block-heading">Best Developer Tool &#8211; RegExRX</h4>



<p><a href="http://www.mactechnologies.com">MacTechnologies Consulting</a>: A cross-platform Regular Expression development tool.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="788" height="768" src="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-1.png" alt="" class="wp-image-6766" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-1.png 788w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-1-300x292.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-1-768x749.png 768w" sizes="auto, (max-width: 788px) 100vw, 788px" /></figure></div>



<h4 class="wp-block-heading">Best Vertical Market App &#8211; qwireCast</h4>



<p><a href="http://www.qwirecast.com">qWire</a>: Desktop app to help Hollywood casting director make cast lists.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="786" height="768" src="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-2.png" alt="" class="wp-image-6769" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-2.png 786w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-2-300x293.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-2-768x750.png 768w" sizes="auto, (max-width: 786px) 100vw, 786px" /></figure></div>



<h4 class="wp-block-heading">Best Vertical Market App &#8211; bMD Medical Software*</h4>



<p><a href="https://historiasclinicas.com.ar">bMD biomedical Developments SRL</a>: Medical practice management software.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="888" height="550" src="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image.png" alt="" class="wp-image-6762" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image.png 888w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-300x186.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/MicrosoftTeams-image-768x476.png 768w" sizes="auto, (max-width: 888px) 100vw, 888px" /></figure></div>



<h4 class="wp-block-heading">Best Plugin &#8211; MBS Plugins</h4>



<p><a href="https://www.monkeybreadsoftware.de/xojo/">MonkeyBread Software</a>: This huge toolbox for Xojo developers includes thousands of classes, controls and examples to extend Xojo.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="750" height="788" src="https://blog.xojo.com/wp-content/uploads/2020/03/monkeybreadplugin.jpg" alt="" class="wp-image-6761" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/monkeybreadplugin.jpg 750w, https://blog.xojo.com/wp-content/uploads/2020/03/monkeybreadplugin-286x300.jpg 286w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure></div>



<p>*Yes, there are two Best Vertical Market Apps, they were both so good we had no choice but to award them both!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Programming your own Solar System with Xojo + MBS SceneKit</title>
		<link>https://blog.xojo.com/2020/02/17/a-solar-system-with-xojo/</link>
		
		<dc:creator><![CDATA[Stefanie Juchmes]]></dc:creator>
		<pubDate>Mon, 17 Feb 2020 10:00:00 +0000</pubDate>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=6604</guid>

					<description><![CDATA[Learn to create a solar system in Xojo with the help of the MBS Xojo Plugin component SceneKit. SceneKit is an Apple framework that supplies functions for graphic and animation designs. 
]]></description>
										<content:encoded><![CDATA[
<p>In this post I will show you how to create you own solar system in Xojo with the help of the <a href="https://www.monkeybreadsoftware.de/xojo/">Monkeybread Software</a> plugin component SceneKit. <a href="https://developer.apple.com/scenekit/">SceneKit</a> is an Apple framework that supplies functions for graphic and animation designs.&nbsp;</p>



<p>Please run a current Xojo version with MBS Xojo Mac64bit Plugin installed. Due to our dependencies list, please add Main, MacCloud, MacBase, MacCocoa, MacControls, MacCG and MacCF plugins too. Start with a new project. To the window we add a SCNControlMBS control from the library and rename it MyControl. Drag it across the entire window size and lock all edges. It is very useful because we want fullscreen mode later.&nbsp;</p>



<p>Then we need two properties MyScene and MyView. MyScene has the type SCNSceneMBS and MyView has the type SCNViewMBS. Afterwards, add the open event of the SceneKit control.&nbsp;</p>



<p>We start with the setting of MyView and MyScene like this:</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<pre class="wp-block-preformatted">MyView = Me.View 
MyScene = New SCNSceneMBS
MyView.scene = MyScene</pre>
</div></div>



<p>Then we enable the default light and the camera control, because we want to see a 3D effect and want to move the camera using the mouse. We set black as the background color.</p>



<pre class="wp-block-preformatted">myView.autoenablesDefaultLighting = True  
MyView.allowsCameraControl = True&nbsp;  
myView.backgroundColor = NSColorMBS.blackColor&nbsp;</pre>



<p>Next we add our first node to the scene. The center of the scene is the Sun. In basic structure the Sun is a lit up sphere. So we add a sphere geometry with a given size. In this project we can&#8217;t work with the original conditions, because Mercury would be so small that it is impossible to see. Plus, we would have same problem for the distance between the Sun and the planets. Because that, our Sun has a radius of 13. Then we add a node and give it geometric information about the Sun. The position of the node is the origin with the coordinates 0,0,0. Finally, we add the node to our scene.&nbsp;</p>



<pre class="wp-block-preformatted">Dim SunGeometry As New SCNSphereMBS(13)  
Dim Sun As New SCNNodeMBS(SunGeometry)  
Sun.Position = New SCNVector3MBS(0, 0, 0)   
MyScene.rootNode.addChildNode(Sun)</pre>



<p>Then we start our program.&nbsp;</p>



<p>We see a white sphere on the screen. The Sun looks a bit edged because of the segment count. Our Sun sphere is very big and needs more segments then the default segment count. Set the segment count property ahead of adding the node to the scene command.&nbsp;</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="712" height="905" src="https://blog.xojo.com/wp-content/uploads/2020/02/Sun.png" alt="" class="wp-image-6605" srcset="https://blog.xojo.com/wp-content/uploads/2020/02/Sun.png 712w, https://blog.xojo.com/wp-content/uploads/2020/02/Sun-236x300.png 236w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure></div>



<pre class="wp-block-preformatted">	SunGeometry.segmentCount=100&nbsp;</pre>



<p>Then we set each planet in a similar way. Because the planets look different, we want to change their colors as appropriate or even put a picture as a graphic over each sphere. For the color of an object we have the firstMaterial.diffuse.contents Property. This is how you would set a gray color for Mercury.&nbsp;</p>



<pre class="wp-block-preformatted"> MercuryGeometry.firstMaterial.diffuse.contents = NSColorMBS.grayColor</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="645" src="https://blog.xojo.com/wp-content/uploads/2020/02/Map-1024x645.png" alt="" class="wp-image-6606" srcset="https://blog.xojo.com/wp-content/uploads/2020/02/Map-1024x645.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/02/Map-300x189.png 300w, https://blog.xojo.com/wp-content/uploads/2020/02/Map-768x484.png 768w, https://blog.xojo.com/wp-content/uploads/2020/02/Map.png 1442w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>If we want to map a picture on a geometry, for example for Earth, we add this picture to our project and set it to the geometry. It&#8217;s a bit like covering it with a blanket with a high percentage of elongation. We can imagine that by covering a sphere, we stretch the blanket on the equator more than on the polar caps. Because that, if you look on a map, the longitudes and latitudes are not parallel, but rather bent. In reality the longitude and latitude are parallel. You can see that on a globe. Fortunately for us a world map is already a perfect UV map for a sphere. Thanks to the website <a href="http://www.ginkgomaps.com">www.ginkgomaps.com</a> which supplies world maps to everyone. I used one of these maps in my example. You can customize the map with a graphic program. Then add it to the project and set it in the property.&nbsp;</p>



<pre class="wp-block-preformatted">Dim EarthGeometry As New SCNSphereMBS(1.47)  
EarthGeometry.segmentCount=100  
Dim Earth As New SCNNodeMBS(EarthGeometry)  
EarthGeometry.firstMaterial.diffuse.contents = EarthPic  
Earth.Position = New SCNVector3MBS(25, 0, 0)&nbsp;  
MyScene.rootNode.addChildNode(Earth)</pre>



<p>All other textures I draw myself in a graphic program.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.xojo.com/wp-content/uploads/2020/02/Earth-1024x768.png" alt="" class="wp-image-6608" srcset="https://blog.xojo.com/wp-content/uploads/2020/02/Earth-1024x768.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/02/Earth-300x225.png 300w, https://blog.xojo.com/wp-content/uploads/2020/02/Earth-768x576.png 768w, https://blog.xojo.com/wp-content/uploads/2020/02/Earth.png 1424w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>For the position of the Planets, we must pay attention to the fact that the origin of the single planets are in the center of the sphere and we set in the constructor of the geometry as the radius and not the diameter. The distance between two planets are: radius of planet 1+radius of planet two+ space between them.&nbsp;</p>



<p>Following this same pattern we add the other planets. Saturn has a planetary ring. The ring is a tube with an inner radius that is bigger than the planet and a small hight. I use the same structure on the ring as on the planet. The tube is a bit rotated. We rotate the ring a bit by x and y. The specification of a rotation looks like this:&nbsp;</p>



<pre class="wp-block-preformatted">saturnRing.orientation = New SCNVector4MBS(-0.4, -0.5, 0, 1)</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="558" height="386" src="https://blog.xojo.com/wp-content/uploads/2020/02/PicSaturn.png" alt="" class="wp-image-6609" srcset="https://blog.xojo.com/wp-content/uploads/2020/02/PicSaturn.png 558w, https://blog.xojo.com/wp-content/uploads/2020/02/PicSaturn-300x208.png 300w" sizes="auto, (max-width: 558px) 100vw, 558px" /></figure>



<p><strong>Let&#8217;s Move the Solar System</strong></p>



<p>Now we want to move the Scene. We assume that the planets&#8217; orbits are all parallel to the xz plane and that they are exactly circular. To roate around a certain point, we create a geometry for each rotation. It lies in the point and is a parent node of the geometry. If a parent node moves, a child node moves too. The inverse does not apply. In that way, if we rotate the helping node in the origin, the child node moves around the origin too. We cannot use the Sun as the parent node for all planets because the planets are supposed to move at different speeds.&nbsp;</p>



<p>The creation of the geometry looks similar for each planet:</p>



<pre class="wp-block-preformatted">Dim UranusRotationGeometry As New SCNSphereMBS(1)  
Dim UranusRotation As New SCNNodeMBS(UranusRotationGeometry) 
UranusRotation.Position = New SCNVector3MBS(0, 0, 0)&nbsp; 
MyScene.rootNode.addChildNode(UranusRotation) </pre>



<pre class="wp-block-preformatted">UranusRotation.addChildNode(Uranus)&nbsp;</pre>



<p>These geometries are covered by the Sun.&nbsp;</p>



<p>Then we add the movements. We defined a rotation of the helping node and set the information about the rotation. We want to rotate around the y axis in each cycle about 360°. The information is given in the unit rad. Because of this we must convert 360° to 6.283 rad. The last parameter is about the speed of the operation. In this section we can set the proportion of the speed of the planets. The speed of Earth is the basic value. Everything is based on this value. The assumption is: an Earth year lasts 365 days. For each planet we use the number of Earth days a planet takes to rotate once around the Sun. We divide this value by the days of an Earth year. For Neptune we get a value that is approximate to 164.79 rad. That we can multiply with a variable. The variable can be set by the customer to regulate the speed of the solar system. We want to repeat this movement again and again. In this way we set it. In the last step we set this rotation to the scene. &nbsp;</p>



<pre class="wp-block-preformatted">Dim moveNeptune As SCNActionMBS = SCNActionMBS.rotateBy(0, 6.283, 0, 164.79 * speed)
Dim Neptunerepeat As SCNActionMBS = SCNActionMBS.repeatActionForever(moveNeptune)
NeptuneRotation.runAction(Neptunerepeat)</pre>



<p>Finally, we want to talk about lighting. The Sun is the light source. It is a light that comes from a point and shines in all directions. That type of light source is called an omni light. We define a light as a property from a node. Since our Sun is a node in the scene, we add the light property directly. All nodes that spray light don’t get any light and they are normally black. With the emission property we can make the sphere look like it is glowing. We choose yellow as color.&nbsp;</p>



<pre class="wp-block-preformatted">Dim SunGeometry As New SCNSphereMBS(13) 
Dim Sun As New SCNNodeMBS(SunGeometry) 
sun.Light = New SCNLightMBS 
sun.Light.Type = SCNLightMBS.SCNLightTypeOmni 
sun.Light.Intensity = 2000
sun.light.Color = NSColorMBS.whiteColor sun.Light.Intensity = 2000 SunGeometry.firstMaterial.emission.contents = NSColorMBS.yellowColor SunGeometry.segmentCount = 100 
Sun.Position = New SCNVector3MBS(0, 0, 0)&nbsp; 
MyScene.rootNode.addChildNode(Sun)</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="766" src="https://blog.xojo.com/wp-content/uploads/2020/02/Solarsystem-1024x766.png" alt="" class="wp-image-6610" srcset="https://blog.xojo.com/wp-content/uploads/2020/02/Solarsystem-1024x766.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/02/Solarsystem-300x224.png 300w, https://blog.xojo.com/wp-content/uploads/2020/02/Solarsystem-768x574.png 768w, https://blog.xojo.com/wp-content/uploads/2020/02/Solarsystem.png 1514w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The scene seems very dark if the Sun is our only light source, so add weak ambient light that lights up all elements in the same way. The unit of the light intensity is lumen. Now you can run the project and admire your own programmed solar system. Have a lot of fun with that.&nbsp;Link to project.</p>



<p>If you have questions about SceneKit don’t hesitate to contact me. And please join my session about SceneKit at the <a href="https://www.xojo.com/xdc/">XOJO.CONNECT</a> conference in Nashville.</p>



<p>Download the <a href="https://blog.xojo.com/wp-content/uploads/2020/02/SolarSystem.zip">project</a>.</p>



<p><em>Stefanie Juchmes studies computer science at the University of Bonn. She came in touch with Xojo due to the work of her brother-in-law and got a junior developer position in early 2019 at<a rel="noreferrer noopener" href="https://www.monkeybreadsoftware.de/xojo/" target="_blank">&nbsp;Monkeybread Software.</a>&nbsp;You may have also read her articles in<a rel="noreferrer noopener" href="http://www.xdevmag.com/" target="_blank">&nbsp;Xojo Developer Magazine</a>.&nbsp;<br></em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: Using the Graphics Class to Create PDF Documents</title>
		<link>https://blog.xojo.com/2019/05/23/using-the-graphics-class-to-create-pdf-documents/</link>
		
		<dc:creator><![CDATA[Christian Schmitz]]></dc:creator>
		<pubDate>Thu, 23 May 2019 16:49:12 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Plugins]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5769</guid>

					<description><![CDATA[Monkeybread Software started with the DynaPDF plugin for Xojo about twelve years ago. As DynaPDF is a C++ library, the wrapping plugin mimics the original&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Monkeybread Software started with the DynaPDF plugin for Xojo about twelve years ago. As DynaPDF is a C++ library, the wrapping plugin mimics the original C API and offers it for Xojo. Over the years a lot more convenient methods have been added to make the plugin more Xojo-like. For example, newer methods can process pictures directly, take colors as Xojo color values and allow drawing of styled text directly.</p>



<p>Since the early days there has been the feature request to use the graphics class in Xojo to draw to a PDF document. We recently came back to this old feature request and decided to try a new way to implement it and our new code seems to work just fine. With some help from Xojo engineers, we even got the alignment right.</p>



<span id="more-5769"></span>



<p>At the Xojo Developer Conference 2019 in Miami in the presentation about news in MBS Xojo Plugin, Christian Schmitz presented this new feature. We can draw the normal drawing commands for lines, rectangles, polygons and pictures, but also text and even vector graphics. With the support of vector graphics, you can even use the report engine in Xojo and let it output your reports as PDF documents.</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1240" height="1754" src="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered4.png" alt="" class="wp-image-5789" srcset="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered4.png 1240w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered4-212x300.png 212w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered4-768x1086.png 768w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered4-724x1024.png 724w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></figure></div>



<p>In your project, you can have a central draw(g as graphics) method, which handles drawing your content. For a print preview, you can let it draw to a picture and show the picture scaled down in a canvas. The same code can be called for drawing to a graphics object from printer received via OpenPrinterDialog function. And for saving as PDF, you can use the graphics object from DynaPDF. Just query PageGraphics object while you have a PDF page open.</p>



<p>Here is a code example:</p>


<blockquote>
<p>
<font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p><font face="courier new">
<p>Dim pdf As New DynapdfMBS<br>Dim f As FolderItem = SpecialFolder.Desktop.Child(&#8220;DynaPDF Graphics.pdf&#8221;)</p>
<p>// For this example you can use a Starter, Lite, Pro or Enterprise License<br>&#8216;pdf.SetLicenseKey &#8220;Starter&#8221;&nbsp;</p>
<p>// Create new PDF. Use f = nil for in-memory PDF<br>Call pdf.CreateNewPDF(f)</p>
<p>// append a new page, so we have an open page<br>Call pdf.Append&nbsp;</p>
<p>// get graphics object to draw on the page<br>Dim g As Graphics = pdf.PageGraphics</p>
<p>// draw as usual<br>g.DrawString &#8220;Hello World&#8221;, 105, 100<br>g.DrawRect 100, 80, 100, 100</p>
<p>// close page and file<br>Call pdf.EndPage&nbsp;<br>Call pdf.CloseFile</p>
<p>// for in-memory PDF, use GetBuffer here to grab it.<br>&#8216;Dim PDFData As String = pdf.GetBuffer</p>
</font><p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
</blockquote>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p><font face="courier new">
<p><font face="courier new"></font></p>
</font><p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>
<p><font face="courier new"></font></p>


<p>As you see, we use normal drawing commands for adding text to the page. A few lines are needed to setup the PDF environment and after drawing to properly close the file. If you like to customize the new PDF pages, you can implement NextPage event on DynaPDFMBS class and for example import an existing PDF document as letter paper for your background. You should also implement Error event to handle any problem while creating the PDF document.&nbsp;</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1240" height="1754" src="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered2.png" alt="" class="wp-image-5787" srcset="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered2.png 1240w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered2-212x300.png 212w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered2-768x1086.png 768w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered2-724x1024.png 724w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></figure></div>



<p>Depending on your DynaPDF license, other features like rendering PDF Pages, importing of other PDF pages or digital signatures may be possible. But even with starter license, you can create new PDF documents and draw into them. If you have questions, please do not hesitate to contact Monkeybread Software. </p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1240" height="1754" src="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered3.png" alt="" class="wp-image-5788" srcset="https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered3.png 1240w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered3-212x300.png 212w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered3-768x1086.png 768w, https://blog.xojo.com/wp-content/uploads/2019/05/DynaPDF-Graphics-Rendered3-724x1024.png 724w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></figure></div>



<p><em>Christian Schmitz has been active in the Xojo community for over 20 years. As the developer behind the Monkeybread Software Plugins he provides thousands of classes and example projects to help you build better applications with Xojo. In Europe, Christian has organized over 10 conferences, including the upcoming </em><a href="http://monkeybreadsoftware.com/conference"><em>conference</em></a><em> in Cologne this fall. You may have also read his articles in </em><a href="http://www.xdevmag.com"><em>Xojo Developer Magazine</em></a><em>. DynaPDF and other MBS plugins are available in the Xojo Add-Ons </em><a href="https://www.xojo.com/store/#addons"><em>Store</em></a><em> and at </em><a href="http://www.monkeybreadsoftware.de/xojo/"><em>Monkeybread Software</em></a><em>.<br></em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: Adding Language Translation to Your Xojo Apps</title>
		<link>https://blog.xojo.com/2019/05/13/guest-post-adding-language-translation-to-your-xojo-apps/</link>
		
		<dc:creator><![CDATA[Tim Dietrich]]></dc:creator>
		<pubDate>Mon, 13 May 2019 10:00:17 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[App Localization]]></category>
		<category><![CDATA[CURL]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Translation]]></category>
		<category><![CDATA[Web Service]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5735</guid>

					<description><![CDATA[I've been amazed at the speed and accuracy of the Amazon Translate service. And after developing the AWSTranslator class, I was able to quickly and easily add language translation to my client's middleware app.]]></description>
										<content:encoded><![CDATA[<p>Recently, I was asked by a client if it would be possible to build language translation functionality into a Xojo-based middleware solution that I had developed for them. The Xojo app obtains product information (including product names, descriptions, and other marketing-related information) from suppliers via a SOAP call, and returns the data in a JSON-encoded response. They wanted to be able to translate the product information, which is provided in English, to other languages (such as French, German, etc). The client wanted something similar to <a href="https://translate.google.com/">Google Translate</a>. However, they wanted the translation function to be built directly into the app and to be performed &#8220;on demand.&#8221;</p>
<p>I did some research and found that Amazon provides a service that does exactly what the client was asking for. The service, called <a href="https://aws.amazon.com/translate/">Amazon Translate</a>, is available as one of many services that are available through Amazon Web Services.</p>
<p>In this post, I&#8217;ll walk you through the process of getting signed up for Amazon Translate, and then share some code that you can use to add language translation to your own Xojo projects. We&#8217;ll use the MBS Xojo CURL Plugin, which makes calling the Amazon Translate API easy. But first, let&#8217;s learn a little about Amazon Translate.</p>
<p><span id="more-5735"></span></p>
<h3><b>Amazon Translate</b></h3>
<p>Amazon Translate is an API that can be used to translate text on demand. You send it text in a &#8220;source language,&#8221; tell the API what that source language is, as well as the &#8220;target language&#8221; that you want the text translated to. The API responds with the translated text.</p>
<p>Amazon Translate uses machine learning and neural networks that have been designed specifically for language translation. When performing a translation, the service reads the text one sentence at a time, and reads each word individually, to determine the meaning of a sentence. In other words, the service doesn&#8217;t just translate words. Instead, it&#8217;s acting as an interpreter. This results in translations that are extremely accurate.</p>
<p>In order to use Amazon Translate, you&#8217;ll need an <a href="http://aws.amazon.com/">AWS account</a>. If you already have an AWS account, log into the account.</p>
<p>Next, you&#8217;ll need to create an &#8220;Identity and Access Management&#8221; (IAM) user. To do so, under Services, select &#8220;IAM&#8221; (which can be found in the &#8220;Security, Identity, &amp; Compliance&#8221; category). This will present you with the IAM Dashboard.</p>
<p>Under Groups, create a new group and give it a recognizable name. For example, you might call the group &#8220;translate.&#8221; As you are creating the group, give it the &#8220;TranslateFullAccess&#8221; permission.</p>
<p>Next, create an IAM user. Under Users, click the &#8220;Add user&#8221; button. Give the user a name such as &#8220;XojoTranslater.&#8221; For the &#8220;AWS access type&#8221; be sure to select &#8220;Programmatic access.&#8221; Add the user to the &#8220;translate&#8221; group that you created above. There&#8217;s no need to assign any tags to the user, so you can skip that step.</p>
<p>And finally, create an Access key for the user. Be sure to make note of both the &#8220;Access key ID&#8221; and &#8220;Secret access key&#8221; values that are automatically assigned. You&#8217;ll need these in order to make API calls.</p>
<h3><b>The MBS Xojo CURL Plugin</b></h3>
<p>If you don&#8217;t already have the <a href="https://www.monkeybreadsoftware.de/xojo/plugin-curl.shtml">MBS Xojo CURL Plugin</a>, download it and install it. To install the plugin, simply drag it into the Xojo &#8220;Plugins&#8221; folder.</p>
<p>The project will work with an unlicensed version of the MBS Xojo CURL Plugin. In this case, you&#8217;ll occasionally see a popup message reminding you to purchase a license. However, I highly encourage you to purchase a license. You can license the plugin individually, or as part of the MBS Complete plugin bundle.</p>
<h3><b>The Xojo Example Project</b></h3>
<p>To demonstrate the Amazon Translate service, I&#8217;ve put together an example Xojo desktop project (<a href="https://s3.amazonaws.com/tdietrich-opensource/aws-translate-demo.xojo_binary_project.zip">project file</a>). Before running the application, be sure to set the three App-level properties: AWSAccessKeyId, AWSSecretAccessKey, and the AWSRegion. For the AWSAccessKeyId and AWSSecretAccessKey properties, use the values that you set when you created the Access key for the user. For the AWSRegion, refer to <a href="https://docs.aws.amazon.com/general/latest/gr/rande.html">this</a> and use the value that makes the most sense for you.</p>
<p>Once you&#8217;ve configured the app, run it, and it will look something like this.</p>
<p> </p>
<h3><b>The Xojo Code</b></h3>
<p>Let&#8217;s take a look at some of the code.</p>
<p>The AWSTranslator class is a subclass of the CURLSMBS class. The class does two important things: It provides access to a list of the languages that are supported, and provides a method for calling the Amazon Translate API.</p>
<p>The &#8220;Languages&#8221; property is a dictionary that you can use to get the names of the languages that Amazon Translate supports and the corresponding language codes. The example app uses this dictionary to populate the &#8220;Translate From&#8221; (SourcePopupMenu) and &#8220;Translate To&#8221; (TargetPopupMenu) popup menus.</p>
<p>The Translate method creates the payload that gets sent to the Amazon Translate API, and sets special HTTP headers that are needed in order to call the API. But most importantly, it uses the CURLSMBS class&#8217;s &#8220;SetupAWS&#8221; method to configure the CURL instance so that all of the steps that are required to &#8220;sign&#8221; the API request are done automatically. This is an amazingly convenient function of the MBS Xojo CURL Plugin. You can get a sense of what&#8217;s involved in signing the request <a href="https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html">here</a>.</p>
<p>To translate text using the AWSTranslator class, you create an instance, configure it with your IAM credentials and AWS region, pass it the source language text, the source language code, and the target language code. In the example app, this all handled in the Window1.Translate method. The values are pulled from the App-level properties, as well as the various window controls. Finally, you call the AWSTranslator instance&#8217;s Translate method. If the translation is successful, the translated text will be available via the TranslatedText property. If any errors occur, the ErrorType and ErrorMessage properties will be set.</p>
<p>The &#8220;Estimated Translation Cost&#8221; is calculated whenever the Source Text changes. The value is calculated by taking the length (number of characters) of the Source Text and multiplying it by 0.000015 (the average cost for translating a single character).</p>
<h3><b>Wrapping Up</b></h3>
<p>I&#8217;ve been amazed at the speed and accuracy of the Amazon Translate service. And after developing the AWSTranslator class, I was able to quickly and easily add language translation to my client&#8217;s middleware app.</p>
<p>I hope you&#8217;re equally impressed by the Amazon Translate service, and that you find the AWSTranslator class to be helpful in your own Xojo projects.</p>
<p><i>Tim Dietrich is a custom software developer based in Richmond, Virginia. To learn more, visit: <a href="https://timdietrich.me/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?q=https://timdietrich.me&amp;source=gmail&amp;ust=1552488320387000&amp;usg=AFQjCNEDiwUxo_XLnpKX-Bt3nL8FIQTxZA">https://timdietrich.me</a></i></p>


<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="711" src="https://blog.xojo.com/wp-content/uploads/2019/05/Screen-Shot-2019-04-01-at-4.21.01-PM-1024x711.png" alt="" class="wp-image-5753" srcset="https://blog.xojo.com/wp-content/uploads/2019/05/Screen-Shot-2019-04-01-at-4.21.01-PM-1024x711.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/05/Screen-Shot-2019-04-01-at-4.21.01-PM-300x208.png 300w, https://blog.xojo.com/wp-content/uploads/2019/05/Screen-Shot-2019-04-01-at-4.21.01-PM-768x533.png 768w, https://blog.xojo.com/wp-content/uploads/2019/05/Screen-Shot-2019-04-01-at-4.21.01-PM.png 1532w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Low-Code Doesn’t Mean No Control</title>
		<link>https://blog.xojo.com/2018/12/20/low-code-doesnt-mean-no-control/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 20:33:39 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Declares]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Low-Code]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[RAD]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5281</guid>

					<description><![CDATA[There are low-code platforms that don't provide ability to call directly into the operating system. Fortunately, Xojo does. Our vision for Xojo has always been to make the tool easy to learn and highly productive to develop applications, without sacrificing power when you need it.]]></description>
										<content:encoded><![CDATA[<p>A recent <a href="https://sdtimes.com/lowcode/report-developers-slow-to-adopt-low-code-and-no-code-solutions/?utm_campaign=Lead%20Gen&amp;utm_source=hs_email&amp;utm_medium=email&amp;utm_content=68473544&amp;_hsenc=p2ANqtz-8dzhQvMkjm1bWV-V5wsL5gl77BnfV9s46laKgpoTl4fq5cfV5PseEzh9nMW9PYdzg8ATrZkQrt6te6cxotB5MRLKsmEw&amp;_hsmi=68473544">SD Times article</a> mentioned a study on how developers who use traditional 3rd generation languages (3GL) view 4GL (these days referred to as <em>low-code</em>) tools/languages. The article sums it up by saying:</p>
<blockquote><p><i style="caret-color: #000000; color: #000000; font-family: arial, helvetica, sans-serif; font-size: 14px;"><span style="color: #585858;">&#8220;Developers adopting low-code platforms want dramatically higher productivity without sacrificing features that allow them to get u</span><span style="color: #585858;">nder the hood if the application they’re building calls for it.&#8221;</span></i></p></blockquote>
<p>That&#8217;s an understandable concern. Developers want the productivity they can get from low-code tools but they don&#8217;t want to give up the ability to call directly into the operating system when they need to. There are low-code platforms that don&#8217;t provide such access. Fortunately, Xojo isn&#8217;t amongst them. Our vision for Xojo has always been to make the tool easy to learn and highly productive to develop applications with, without sacrificing power when you need it.</p>
<p>In those rare cases when you need to use an OS capability for which the Xojo framework does not provide built-in support, there are three different ways to do so:</p>
<ol>
<li>The Shell &#8211; Xojo&#8217;s Shell class makes it easy to issue OS commands and get back results.</li>
<li>Plugins &#8211; These are libraries (usually written in C or C++) that can include OS SDK calls.</li>
<li>Declares &#8211; These allow the developer to call individual OS calls from their code.</li>
</ol>
<p>If you&#8217;re a developer using a traditional 3GL language and want to get the productivity benefit of low-code tools, take a look at Xojo as it gives you that without sacrificing low-level OS access.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Software Distribution Simplified with GuancheMOS</title>
		<link>https://blog.xojo.com/2018/06/26/software-distribution-simplified-with-guanchemos/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 26 Jun 2018 10:00:09 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[AprendeXojo]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Plugins]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=4476</guid>

					<description><![CDATA[For software, distribution usually means generating and validating unique serial numbers for each of your products and users. This helps you manage your users, possibly unlock a free trial or demo version for full use and, of course, to minimize the illegal use of your software.]]></description>
										<content:encoded><![CDATA[<p>In an ideal world there is a person responsible for every step in software development, from coding, UI design, distribution, documentation, marketing and support. All of this can seem really overwhelming for independent developers and small businesses. But if you break it down and take it one piece at a time, it&#8217;s manageable by even the smallest team of one. Right now, let&#8217;s look at <strong>software distribution</strong>.</p>
<p>For software, distribution usually means generating and validating unique serial numbers for each of your products and users. Serial numbers (or license keys) help you manage your users, unlock a free trial or demo version for full use and, of course, minimize illegal use of your apps.</p>
<p><span id="more-4476"></span></p>
<p>Let&#8217;s admit it, there is no silver bullet. Even the greatest companies (you know who you are) throw lots of money at implementing and improving serious protection schemes that are often quickly bypassed.  It comes down to: How much time, money and resources are <em>you</em> willing to spend implementing a protection or licensing scheme?</p>
<p>The <em>bad guys</em> will always find a way to break your software protection if they are interested in doing that. Does that mean giving up on protecting your software? Not at all! When I was faced with the problem myself, in order to protect my own products, I went to the drawing board to build a way to generate unique serial numbers —or licensing information— for all the Xojo supported platforms.</p>
<p>The result of this process was the <a href="https://www.aprendexojo.com/shop/guanchemos-serial-number-generation-and-validation-for-xojo-developers/"><b>GuancheMOS plug-in</b></a>. GuancheMOS is a fully multiplatform plug-in for desktop, web and console apps (not for iOS due to the fact that iOS only can link against static libraries), on 32-bit and 64-bit architectures.</p>
<p>The simplicity of GuancheMOS means that you can use it as is, or as the starting point to build your own private and unique serial number automations. Integrate it as part of the purchase process in your website, wrap it as the core piece of other unique information collection. It&#8217;s already used by dozens of developers around the world in ways I hadn&#8217;t ever thought of while designing it! The best part, is that implementing GuancheMOS in your product takes about 5 minutes.</p>
<p>You can download and try <a href="https://www.xojo.com/store/#addons">GuancheMOS</a> for free today.</p>
<p><em>Javier Rodri­guez has been the Xojo Spanish Evangelist since 2008, he’s also a Developer, Consultant and Trainer who has be using Xojo since 1998. He manages <a href="http://www.aprendexojo.com">AprendeXojo.com</a> and is the developer behind the GuancheMOS plug-in for Xojo Developers, Markdown Parser for Xojo, HTMLColorizer for Xojo and the Snippery app, among others</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Short-Term Xojo Roadmap</title>
		<link>https://blog.xojo.com/2017/09/19/the-short-term-xojo-roadmap/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 19 Sep 2017 15:47:51 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Interops]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Roadmap]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=3384</guid>

					<description><![CDATA[An update to the short-term Xojo roadmap, including 64-bit support and IDE, interpos and more.]]></description>
										<content:encoded><![CDATA[<p>At each XDC (<a href="http://www.xojo.com/xdc">Xojo Developer Conference)</a> I lay out, however roughly, what Xojo&#8217;s short-term development roadmap looks like for the next 12 months or so. Despite how well-conceived that roadmap may be, sometimes unexpected events occur that change or delay things.</p>
<p><span id="more-3384"></span></p>
<p>64-bit support, for example, has been a major focus and continues to be. At one time, 64-bit was a nice-to-have. Then it became important and now it&#8217;s critical. There are Linux distributions that no longer provide 32-bit support. iOS now requires apps to be compiled to 64-bit in order to be in the App Store. You might have noticed that the 2017r2 cycle was longer than usual. This was due to the fact that we were doing some major refactoring of how strings are handled under 64-bit. Some of the string functions you depend on were not always behaving themselves and were much slower than they were in 32-bit applications. That refactoring took twice as long as we&#8217;d originally planned. That&#8217;s just the way things go sometimes. Even companies such as Microsoft and Apple have announced features that were later delayed. We&#8217;ve all been there.</p>
<p>We are also working to provide a 64-bit version of the Xojo IDE. This is important for those you of with large projects because the current 32-bit IDE can only address so much memory. Once your project gets big enough, the IDE can run out of memory even though your computer has plenty to spare. We need this ourselves because the Xojo IDE is written in Xojo and as you can probably imagine, is a <em>very</em> big project. 64-bit applications can address all of the memory your computer (or <a href="https://blog.xojo.com/2017/03/29/64-bit-why-is-it-so-important/">any future computer</a> you own) will ever have. A 64-bit version of the IDE will permanently resolve this issue.</p>
<p>Sometimes the platform vendors make changes that require us to rearrange things a bit in the short term. For example, our first 64-bit platform was going to be Linux until Apple announced the 64-bit requirement for iOS apps to be in the iOS App Store far earlier than expected. Recently, Apple made it clear that under iOS 11 the Xcode 9 version of the iOS Simulator would not support 32-bit apps or debugging. We had originally planned to support 64-bit iOS Simulator debugging in 2018. Instead we are working hard and fast on that right now.</p>
<p>As a result of all this, some of our plans have been pushed out a bit. We had originally aimed to have Android, interops and plugins made with Xojo available for beta testing by the end of this calendar year. Now that&#8217;s not going to happen. We are still working quite hard on all these things (and more) but the 64-bit work has just waylaid us a bit. It is our intention, barring any additional unforeseen circumstances, to ship these features in the first half of 2018.</p>
<p>Fortunately, not all things have been delayed. We are working on a big update to the Windows framework that will dramatically reduce the flicker you sometimes see. This will not just improve the user experience of your apps but the Windows version of the Xojo IDE as well. Those of you that deploy to Windows or use Xojo itself on Windows will be quite pleased. I&#8217;m confident we will have these improvements available by year end.</p>
<p>If you want to help us with testing 64-bit Xojo or the updated Windows framework this year, <a href="https://forum.xojo.com/38207-welcoming-more-pre-release-testers">please join our Pre-Release Testing Program</a>.</p>
<p>For those of you that have been participating in pre-release testing, thank you so much. You are providing a valuable service to us and the Xojo community at large.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
