<?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>Monkeybread Software &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/monkeybread-software/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Wed, 11 Jun 2025 16:25:16 +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>Spotlight On: Sounds In Sync</title>
		<link>https://blog.xojo.com/2025/06/11/spotlight-on-sounds-in-sync/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 16:25:14 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14951</guid>

					<description><![CDATA[Spotlight On posts focus on Xojo community members. We’ll use this space to tell the stories of people using Xojo, share amazing Xojo-made apps and&#8230;]]></description>
										<content:encoded><![CDATA[
<p><em>Spotlight On posts focus on Xojo community members. We’ll use this space to tell the stories of people using Xojo, share amazing Xojo-made apps and spread awareness of community resources. If you have an app, a project or a person you want to see featured in Spotlight On, <a href="mailto:hello@xojo.com" target="_blank" rel="noreferrer noopener">tell us about it</a>!</em></p>



<p>We first met Mark Franken in 2016 at a Xojo Developer Conference in Houston, Texas. Today, Mark splits his time between writing software and caring for 40 acres of rainforest. But before he traded city life for the wild, he spent decades in film and television post-production. In 2003, while still working in post, he founded <a href="https://www.soundsinsync.com/">Sounds In Sync</a>, a company born out of his desire to solve the problems he faced in the editing room. What started as a side project quickly grew in popularity, and eventually, Mark shifted his focus full-time to software development. As a sound editor, Mark worked on some iconic and award-winning films including <em>The Lord of the Rings: Return of the King</em>, <em>Mad Max: Fury Road</em>, <em>The Great Gatsby</em>, <em>Happy Feet Two</em>, and <em>Peter Rabbit</em>. </p>



<h3 class="wp-block-heading"><strong>Mac, Windows or Linux?</strong></h3>



<p>Develop on Mac, build for Mac &amp; Windows</p>



<h3 class="wp-block-heading"><strong>How would you explain your most recent project to a new developer?</strong></h3>



<p>I&#8217;ve been working on a major update for my app <a href="https://www.soundsinsync.com/products/edicue">EdiCue</a>, scheduled for release as EdiCue v5 in June 2025.</p>



<p>EdiCue is a tool used by sound editors to &#8220;cue&#8221; dialogue that needs to be re-recorded in film and TV projects. Typically, this involves working alongside the sound editing application <a href="https://www.avid.com/pro-tools">Pro Tools</a> to place clips on the timeline, each clip aligned with a section of dialogue and named with the exact text the actor needs to re-perform (e.g., due to background noise, unclear delivery, or script changes).</p>



<p>For this release, I wanted to streamline the manual cueing process by integrating&nbsp;AI-based speech-to-text. Specifically, I’ve added a new feature that allows users to load a WAV file, transcribe the dialogue using&nbsp;Whisper AI, and then export a Pro Tools session with timeline clips automatically named using the transcribed text and timing.</p>



<p>The integration required wrapping whisper.cpp for use in my Xojo-based application. I worked with Christian from Monkeybread Software (MBS) to build a custom plugin that bridges between Xojo and the compiled Whisper Dylib/DLL files, enabling support for macOS and Windows.</p>



<h3 class="wp-block-heading"><strong>What is something that has surprised you about coding in the last 5 years?</strong></h3>



<p>The biggest surprise for me has been how far&nbsp;AI has come in understanding, writing, and explaining code. While it still makes mistakes and doesn’t always produce perfect output, for me it’s now an invaluable tool, working in languages I hadn’t formally learned like&nbsp;Python&nbsp;and&nbsp;C/C++.</p>



<p>Thanks to AI, I’ve been able to build and compile C/C++ libraries and create my own&nbsp;shared libraries (Dylibs/DLLs). This has let me expose C++ functionality through clean C-style APIs, making them accessible from within my&nbsp;Xojo applications. It’s dramatically expanded what my apps are capable of.</p>



<p>In the past, I’d reach out to Christian at <a href="https://www.monkeybreadsoftware.de/">Monkeybread Software</a> to write me a  plugin or port specific code to Xojo, something I’ve always appreciated. But for my latest project, I needed to navigate this myself as I wasn’t exactly sure what was required from the start.</p>



<p>With AI’s help, I’ve successfully compiled&nbsp;third-party libraries that use gRPC&nbsp;for both macOS and Windows, built a shared library layer, and exposed the functions I needed to call from Xojo.</p>



<p>I learnt a lot in the process, and now I’m confident in rebuilding and maintaining these libraries as updates are released.</p>



<h3 class="wp-block-heading"><strong>Xojo isn&#8217;t the only tool in your kit. What is a piece of software more people should know about?</strong></h3>



<p>One tool I highly recommend is <a href="https://hexfiend.com/">Hex Fiend</a> &#8211; a hex editor for macOS. I found it especially invaluable while updating my Xojo WAV file classes, where I needed to ensure that I was reading and writing metadata correctly.</p>



<p>Hex Fiend&#8217;s main window displays the raw hex data of the file, while a side panel interprets the data for various file formats, including support for&nbsp;WAV files. It decodes the fields, letting you see exactly how your code is affecting the underlying binary layout.</p>



<p>This allowed me to track down a number of bugs in my metadata handling code which would have been hard to track down otherwise.</p>



<h3 class="wp-block-heading"><strong>How did you find Xojo? And when did you start using Xojo?</strong></h3>



<p>I first discovered Xojo back in&nbsp;2002, when it was still known as&nbsp;RealBasic. At the time, I was working as a&nbsp;sound editor on&nbsp;<em>The Lord of the Rings – The Two Towers</em>&nbsp;in New Zealand. A fellow editor visiting from San Francisco introduced me to it, and I was immediately impressed.</p>



<p>I had been using&nbsp;Delphi/Kylix&nbsp;up to that point, but I was looking for a way to build&nbsp;cross-platform desktop apps for Mac and Windows. RealBasic’s ability to generate native applications for both platforms from a single codebase had me sold, and it fit perfectly with the kind of tools I wanted to create for audio post-production workflows.</p>



<h3 class="wp-block-heading"><strong>What did you first build with Xojo? And when was that?</strong></h3>



<p>In&nbsp;December 2003, I built my first Xojo app ‘EdiTrace Auto’ for both&nbsp;Mac (OS9) and Windows. It was designed to load EDL (Edit Decision List) files generated by my online comparison tool at&nbsp;EdiTrace.com.</p>



<p>The app would parse the EDL events and convert them into&nbsp;keystroke commands&nbsp;that it could send to&nbsp;Pro Tools, automating the process of recutting sound edits to match the latest picture version delivered by the video editors. This saved sound editors a huge amount of time by eliminating the need to manually conform their sessions to match the new picture cut.</p>



<h3 class="wp-block-heading"><strong>What do you build with it now?</strong></h3>



<p>My original app ‘EdiTrace Auto’ eventually evolved into a more powerful tool: <a href="https://www.soundsinsync.com/products/ediload">EdiLoad</a>. In January 2025, I released EdiLoad v6, which includes a major new feature: the ability to compare the waveforms of &#8220;assembled&#8221; WAV files against a guide track provided by the picture department.</p>



<p>This lets sound editors verify that WAV files recorded on set are assembling&nbsp;perfectly in-phase, down to the sample, with the guide audio, ensuring audio alignment is sample-accurate.</p>



<p>To implement this, I explored how <a href="https://en.wikipedia.org/wiki/Fast_Fourier_transform">Fast Fourier Transform</a> (FFT) can be used to analyze the frequency content of complex waveforms. A helpful introduction for me was this YouTube <a href="https://www.youtube.com/watch?v=spUNpyF58BY">video</a>, which explained the core concepts.</p>



<p>After a fair amount of experimentation, I landed on a solution using an&nbsp;FFT function from an MBS plugin. I transform the two waveforms,&nbsp;sum&nbsp;them, and invert the result to obtain the&nbsp;sample-level offset.</p>



<p>In EdiLoad this processing is handled by a Xojo Worker, which was the first time I had used one. It was a great fit, as each alignment task just required two file paths, a time range, and a handful of user settings. The workers allow the app to access multiple cores while batch-processing all files in the assembly. You can see the feature in action in this EdiLoad v6 demo <a href="https://www.youtube.com/watch?v=4Q0GlTgyrxk">video</a>.</p>



<h3 class="wp-block-heading"><strong>What is something you worked on that you want to talk about?</strong></h3>



<p>One project I’m particularly proud of is writing a set of&nbsp;Xojo classes to read and write Pro Tools session (.ptx) files, despite having no formal software development training.</p>



<p>Pro Tools sessions store their data in a&nbsp;proprietary binary format, and there’s&nbsp;no public specification&nbsp;available. But to deliver key features my clients needed, I had to find a way to read and write these files directly from my Xojo apps.</p>



<p>To reverse-engineer the format, I built several test apps to see how the data was structured, and then modify known parts of the PTX files and compared results. By selectively changing binary data, I was able to track down how specific values were stored. It was a&nbsp;painstaking, months-long process, but it ultimately gave me the tools to read and write session data reliably.</p>



<p>These classes are now in used in&nbsp;three of my desktop apps. I also created a&nbsp;REST API&nbsp;that several online services use to convert marker data into PTX session files, allowing users to generate markers that can be imported directly into Pro Tools.</p>



<h3 class="wp-block-heading"><strong>Do you earn a living with Xojo?</strong></h3>



<p>Yes. Xojo, and the supportive Xojo community gave me the opportunity to learn software development in my spare time while I was still working full-time as a sound editor. Over time, I was able to release my own apps through my website, gradually building up a sustainable software business.</p>



<p>After 20 years in post-production, I was able to&nbsp;transition full-time into software development. That shift also gave my family and me the freedom to&nbsp;leave the city (Sydney, Australia)&nbsp;and move to a quieter life in the bush, about six hours up the coast.</p>



<p>Now I work from home, doing what I love, and I’m incredibly grateful for the flexibility it gives me to be present while our kids grow up. It’s not just a career change, it’s been a lifestyle upgrade.</p>



<h3 class="wp-block-heading"><strong>Do you use it for any hobbies?</strong></h3>



<p>Not really. When I’m not working, I try to&nbsp;step away from the screen. I spend my downtime in the&nbsp;garden, the bush, or looking after my bees. But I find quite often that I get my best code insights and ideas while I’m in nature.</p>



<h3 class="wp-block-heading"><strong>What&#8217;s your biggest Xojo success?</strong></h3>



<p>Without a doubt, it’s been&nbsp;getting my applications established across the global film and TV industry, and using my background in sound editing to develop&nbsp;cutting-edge tools&nbsp;that directly support my peers.</p>



<p>The highlight has been receiving not one, but two Engineering Emmy Awards, one for <a href="https://youtu.be/v58nn4Ly0SQ">EdiCue</a> and another for EdiLoad. These awards recognized the impact of my apps in setting new standards for technological excellence in television post-production.</p>



<p><em>Thank you to Mark Franken for answering questions and sharing his Xojo experience with the community. Learn more about <a href="https://www.soundsinsync.com/about">Sounds In Sync</a>.</em></p>



<p><em>If you have an app, a project or a person you want to see featured in Spotlight On,&nbsp;<a href="mailto:hello@xojo.com" target="_blank" rel="noreferrer noopener">tell us about it</a>!</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>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Only 48 Days Until Monkeybread Software&#8217;s Xojo Conference</title>
		<link>https://blog.xojo.com/2024/03/05/only-48-days-until-monkeybread-softwares-xojo-conference/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Tue, 05 Mar 2024 15:20:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12635</guid>

					<description><![CDATA[Monkeybread Software and Christian Schmitz have organized an exceptional event in Germany in just 2 months. Take this opportunity to meet and network with members of the global Xojo Community. Meet Geoff Perlman, Xojo's Founder &#038; CEO and Xojo Engineers, Javier Menendez and Ricardo Cruz.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Register now for the biggest Xojo event in 2024!</h2>



<p><a href="https://www.monkeybreadsoftware.de/xojo/events/andernach-2024-event.shtm">Monkeybread Software</a> and Christian Schmitz have organized an exceptional event in Germany taking place in just 2 months &#8211; April 22nd to 27th. Take this opportunity to meet and network with members of the global Xojo Community. Meet Geoff Perlman, Xojo&#8217;s Founder &amp; CEO and Xojo Engineers, Javier Menendez and Ricardo Cruz.</p>



<h3 class="wp-block-heading">This event includes:</h3>



<ul class="wp-block-list">
<li>Keynotes from Geoff Perlman and Christian Schmitz</li>



<li>Educational, Feedback and Q&amp;A Sessions</li>



<li>Web Lab with Xojo&#8217;s Ricardo Cruz</li>



<li>Performance Lab with MBS&#8217;s Christian Schmitz</li>



<li>Dinners, Networking and Sightseeing</li>
</ul>



<h2 class="wp-block-heading">Training, Sessions &amp; Events</h2>



<h3 class="wp-block-heading"><a href="https://www.monkeybreadsoftware.de/xojo/events/andernach-2024-event.shtml#Schedule"><strong>6 Day Schedule</strong></a></h3>



<p>Monday          22nd April        Welcome Event<br>Tuesday         23rd April         Sight Seeing Tour &amp; Dinner<br>Wednesday    24th April         Training Day &amp; Reception in Hotel<br>Thursday        25th April         Conference &amp; Dinner at Baggerado<br>Friday             26th April         Conference &amp; Farewell Dinner<br>Saturday         27th April         Geyser Tour</p>



<h2 class="wp-block-heading">Einstein Hotel Am Römerpark</h2>



<p>The event will be hosted at the <a href="https://www.einsteinhotels.de/">Einstein Hotel Am Römerpark</a>, a modern business and conference hotel with unique ambiance and modern facilities. Located in Andernach across from the river Rhine, the hotel features a garden, lounge, terrace and the Sky Bar &amp; Restaurant.</p>



<figure class="wp-block-image size-large is-style-default"><img fetchpriority="high" decoding="async" width="1024" height="394" src="https://blog.xojo.com/wp-content/uploads/2024/03/andernach-1024x394.png" alt="" class="wp-image-12642" srcset="https://blog.xojo.com/wp-content/uploads/2024/03/andernach-1024x394.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/03/andernach-300x115.png 300w, https://blog.xojo.com/wp-content/uploads/2024/03/andernach-768x295.png 768w, https://blog.xojo.com/wp-content/uploads/2024/03/andernach.png 1300w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Visit, Attend &amp; Network</h2>



<h3 class="wp-block-heading"><a href="https://www.andernach-tourismus.de/en/">Location: Andernach</a></h3>



<p>Networking is not limited to the event hotel! Enjoy the evenings with other Xojo users at casual get-togethers. Arrive a day or two before the conference or stay over the weekend and schedule time to enjoy the area. Join the <a href="https://www.monkeybreadsoftware.de/xojo/events/andernach-2024-event.shtml#SightSeeingTour">group for sightseeing</a> and a <a href="https://www.monkeybreadsoftware.de/xojo/events/andernach-2024-event.shtml#GeyserTour">Geyser Tour</a>. Andernach has much to offer visitors including the &#8220;Runde Turm&#8221; (round tower), Mariendom (Cathedral of Mary), the old crane on the Rhine River front, the Mikveh or the well preserved town wall.</p>



<p>Learn everything else you need to know and <a href="https://www.monkeybreadsoftware.de/xojo/events/register.shtml">Register Today</a> at <a href="https://www.monkeybreadsoftware.de/xojo/events/andernach-2024-event.shtml">Monkeybread Software</a>.</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>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Developer Retreat Recap</title>
		<link>https://blog.xojo.com/2022/10/04/xojo-developer-retreat-recap/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Tue, 04 Oct 2022 19:18:21 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[XDC]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Keynote]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10754</guid>

					<description><![CDATA[In September we hosted The Xojo Developer Retreat in Nashville and it was a huge success! From exciting educational sessions, to an exploration of the Xojo product roadmap, to informative presentations from Xojo Engineers about how Xojo is made and the Xojo framework, there was a lot to take in! If you missed any of the announcements that were shared, you can watch Founder and CEO Geoff Perlman's Conference Keynote free on YouTube. The rest of the session videos are available for purchase here.]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>In September we hosted <a rel="noreferrer noopener" href="https://www.xojo.com/xdc" target="_blank">The Xojo Developer Retreat</a> in Nashville and it was a huge success! From exciting educational sessions, to an exploration of the Xojo product roadmap, to informative presentations from Xojo Engineers about how Xojo is made and the Xojo framework, there was a lot to take in! If you missed any of the announcements that were shared, you can watch Founder and CEO Geoff Perlman&#8217;s <a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=mWEH0kjXZiA" target="_blank">Conference Keynote free on YouTube</a>. The rest of the session videos are available for purchase <a rel="noreferrer noopener" href="https://www.xojo.com/store/#conference" target="_blank">here</a>.</p>



<p>The conference kicked off Sunday night in the hotel bar and lobby where guests checked-in, got some Xojo swag and mingled. It was a reunion for many, as we &#8212; including the Xojo Team &#8212; hadn&#8217;t seen each other in quite some time. And we also got to meet many new Xojo fans and attendees for the first time! </p>



<p>I was really excited to finally meet James and Peter from <a href="https://www.controlbionics.com/" target="_blank" rel="noreferrer noopener">Control Bionics</a> &#8211; I have been communicating with them for years but never met them in person! It was also great to catch up with Jérémie Leroy, Christian Schmitz and Tim Dietrich. </p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-large"><img decoding="async" width="727" height="1024" src="https://blog.xojo.com/wp-content/uploads/2022/10/957D5972-0F87-451A-B315-F4048F5CAD08-2-727x1024.jpg" alt="" class="wp-image-10786" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/957D5972-0F87-451A-B315-F4048F5CAD08-2-727x1024.jpg 727w, https://blog.xojo.com/wp-content/uploads/2022/10/957D5972-0F87-451A-B315-F4048F5CAD08-2-213x300.jpg 213w, https://blog.xojo.com/wp-content/uploads/2022/10/957D5972-0F87-451A-B315-F4048F5CAD08-2-768x1082.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/957D5972-0F87-451A-B315-F4048F5CAD08-2.jpg 1066w" sizes="(max-width: 727px) 100vw, 727px" /><figcaption>Outside of Hyatt Centric Nashville Hotel</figcaption></figure>
</div>
</div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-1024x768.jpeg" alt="" class="wp-image-10779" width="915" height="686" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4496-2048x1536.jpeg 2048w" sizes="(max-width: 915px) 100vw, 915px" /><figcaption>Sunday evening meet &amp; greet</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-1024x768.jpg" alt="" class="wp-image-10772" width="915" height="686" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-1024x768.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-300x225.jpg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-768x576.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-1536x1152.jpg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2081-2048x1536.jpg 2048w" sizes="auto, (max-width: 915px) 100vw, 915px" /><figcaption>Alvaro, Tim and Paul chatting before a session.</figcaption></figure>



<p>Day one of the conference began with breakfast and Geoff&#8217;s keynote. He talked about many of the things that happened at Xojo since the last conference, such as 302 new features, 286 changes and 1400+ bug fixes. He also talked about Android and the Bug Bash, which are summarized below:</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a-1024x768.jpg" alt="" class="wp-image-10765" width="915" height="686" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a-1024x768.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a-300x225.jpg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a-768x576.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a-1536x1152.jpg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/e00ac735a1048c076ccb1b882659d9285327784a.jpg 1920w" sizes="auto, (max-width: 915px) 100vw, 915px" /><figcaption>Geoff Perlman keynote, discussion product roadmap</figcaption></figure>



<p><strong>Android &#8211; </strong>When we showed Android at the last XDC it was essentially just a proof of concept. We had three possible routes we were going to take in terms of code compilation and had not even tried the first one. We ultimately went with plan B, which worked as expected. We are now feature complete for the first Android release and are rapidly fixing bugs. More on Android was discussed by Xojo Engineer Travis Hill during his session, <em>The ABC&#8217;s of Android</em>.</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/2022/10/IMG_4540-1024x768.jpeg" alt="" class="wp-image-10787" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4540-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4540-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4540-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4540-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4540-2048x1536.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Travis discussing Xojo&#8217;s Android support</figcaption></figure>



<p><strong>Bug Bash</strong> &#8211; We spent the month of August doing a Bug Bash and focused on <em>different</em> bug criteria than we usually focus on. We typically focus on the overall impact surface and bugs that we know will impact nearly everyone in a way that can’t be worked around get the highest priority. We realize that there are some bugs that do not affect many people but are very painful for those they do affect. And that is specifically where we wanted to focus our efforts with the Bug Bash this year.</p>



<p>The Bug Bash gave our engineers an opportunity to work on parts of Xojo they usually don’t work on making them more comfortable working in those areas. This increases our coverage in terms of who can work on what. In fact, today more of the team is comfortable working in different parts of Xojo than ever before. Most of the engineers have worked on the compiler, for example. We felt like this Bug Bash went really well and going forward we will dedicate 2 weeks per cycle to focus on fixing those types of bugs (mentioned above) when we look at what to focus on. &nbsp;</p>



<p>Many other topics were covered in the keynote, like the Xojo community, Xojo&#8217;s participation in the GitHub Student Developer Pack, Xojo users, our design strategy and the Xojo product roadmap. </p>



<p>The rest of the morning continued with a session from Paul Lefebvre about how Xojo is made, followed by William&#8217;s session about the Xojo framework.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="769" src="https://blog.xojo.com/wp-content/uploads/2022/10/755aa90c4dc2b8c9f19824a73c0fbe29eec6448f_2_1332x1000-1024x769.jpg" alt="" class="wp-image-10766" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/755aa90c4dc2b8c9f19824a73c0fbe29eec6448f_2_1332x1000-1024x769.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/755aa90c4dc2b8c9f19824a73c0fbe29eec6448f_2_1332x1000-300x225.jpg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/755aa90c4dc2b8c9f19824a73c0fbe29eec6448f_2_1332x1000-768x577.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/755aa90c4dc2b8c9f19824a73c0fbe29eec6448f_2_1332x1000.jpg 1332w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Xojo Engineer William Yu talking about the Xojo framework</figcaption></figure>



<p>After lunch, we heard sessions from experts in the Xojo community. Always an interesting subject, Jim Meyer talked to us about using machine learning in Xojo apps. Kem Tekinay gave an interesting talk about using MemoryBlocks. Xojo Engineer Ricardo Cruz talked about the WebSDK. </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/2022/10/IMG_4542-1024x768.jpeg" alt="" class="wp-image-10770" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4542-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4542-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4542-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4542-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4542-2048x1536.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Kem Tekinay talks MemoryBlocks</figcaption></figure>



<p>We ended the day with two non coding sessions &#8211; Amy Barnes talked about the legal side of programming and Yousaf Shah discussed things you can do to improve your business other than coding. You can review the full sessions list and descriptions of all of the sessions <a rel="noreferrer noopener" href="https://xojo.com/xdc/HTML/sessions-nashville.html" target="_blank">here</a>.</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/2022/10/IMG_2099-1024x768.jpg" alt="" class="wp-image-10773" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2099-1024x768.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2099-300x225.jpg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2099-768x576.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2099-1536x1152.jpg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_2099-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Amy Barnes shares some of her expertise with the group during her session</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-768x1024.jpeg" alt="" class="wp-image-10767" width="768" height="1024" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-768x1024.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-225x300.jpeg 225w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-1152x1536.jpeg 1152w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-1536x2048.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4525-scaled.jpeg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption>Javier, William and Paul</figcaption></figure>



<p>After sessions, it was time to go out on the town! We had a nice dinner at The Stillery, right in the midst of the craziness that is the Nashville Broadway area. After dinner a group headed out to one of the local honkey tonks to enjoy some live music! </p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-1024x768.jpeg" alt="" class="wp-image-10768" width="915" height="686" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4544-2048x1536.jpeg 2048w" sizes="auto, (max-width: 915px) 100vw, 915px" /><figcaption>Conference dinner at The Stillery</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-768x1024.jpeg" alt="" class="wp-image-10771" width="768" height="1024" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-768x1024.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-225x300.jpeg 225w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-1152x1536.jpeg 1152w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-1536x2048.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4547-scaled.jpeg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption>Group photo at a honkey tonk on Broadway</figcaption></figure>



<p>Only morning sessions on day two when we heard from Christian all about MonkeyBread Plugins, his session gave some inspiration to Tim Dietrich, read about that <a rel="noreferrer noopener" href="https://timdietrich.me/blog/xojo-phidgets-mbs-environment-monitor-app/" target="_blank">here</a>. Then Derrick Donnelly gave a very interesting talk about building digital forensic apps with Xojo (watch out for your fridge!) and the educational portion of the conference wrapped with Xojo Engineer Javier Menendez talking about integrating WooCommerce into Xojo apps. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4601-768x1024.jpg" alt="" class="wp-image-10769" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4601-768x1024.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4601-225x300.jpg 225w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4601-1152x1536.jpg 1152w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_4601.jpg 1170w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption>Lunch at The Diner</figcaption></figure>



<p>We had lunch at a local diner, appropriately named The Diner. Then it was time for some fun &#8211; we visited an Escape Room (<a rel="noreferrer noopener" href="https://theescapegame.com/nashville/" target="_blank">The Escape Game</a>)! We split into three very competitive teams and entered the themed rooms where we had to &#8220;escape&#8221; by following clues and solving puzzles before the time ran out. Since we are all excellent problem-solvers, all of the groups amazingly made it out before the time ran out and none of the attendees or employees are still there. Everyone who particiapted really enjoyed it so we may do this type of activity at a future event. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_0300-768x1024.jpg" alt="" class="wp-image-10774" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_0300-768x1024.jpg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_0300-225x300.jpg 225w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_0300-1152x1536.jpg 1152w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_0300.jpg 1250w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption>Prison break theme at The Escape Game</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-1024x768.jpeg" alt="" class="wp-image-10775" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_3075-2048x1536.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Time travel theme at The Escape Game</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-1024x768.jpeg" alt="" class="wp-image-10776" width="915" height="686" srcset="https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-1024x768.jpeg 1024w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-300x225.jpeg 300w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-768x576.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-1536x1152.jpeg 1536w, https://blog.xojo.com/wp-content/uploads/2022/10/IMG_6634-2048x1536.jpeg 2048w" sizes="auto, (max-width: 915px) 100vw, 915px" /><figcaption>Gold Rush theme at The Escape Game</figcaption></figure>



<p>It was really nice to get back to an in-person event and we look forward to doing more! Though we don&#8217;t have any plans to announce yet for the next conference, we are hosting a <a href="https://forum.xojo.com/t/london-xojo-meetup-november-9/72420" data-type="URL" data-id="https://forum.xojo.com/t/london-xojo-meetup-november-9/72420">Xojo social meetup</a> in London on November 9th, so if you happen to be there please come by and say hi!</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</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>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Heatmaps with the Monkeybread ChartDirector Plugin</title>
		<link>https://blog.xojo.com/2021/07/13/heatmaps-with-monkeybread-chartdirector-plugin/</link>
		
		<dc:creator><![CDATA[Stefanie Juchmes]]></dc:creator>
		<pubDate>Tue, 13 Jul 2021 15:00:00 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[XDC]]></category>
		<category><![CDATA[Charts]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[OmegaBundle]]></category>
		<category><![CDATA[Third Party]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=8804</guid>

					<description><![CDATA[In this blog post I want to show you how to build a heatmap as a representative for other diagrams. In order to complete this project you'll the MBS Xojo ChartDirector Plugin, conveniently included in the Omegabundle. A heat map is a grid of fields...]]></description>
										<content:encoded><![CDATA[
<p>In this blog post I want to show you how to build a heatmap. In order to complete this project you&#8217;ll need the <a href="https://www.xojo.com/store/addons/MBS.php">MBS Xojo ChartDirector Plugin</a>, conveniently included in the <a href="http://omegabundle.net/">Omegabundle</a> right now.</p>



<p>A heatmap is a grid of fields that can have different sizes and colors. Heatmaps are often used to analyze website user behavior. Each area is assigned a color, and heat maps let you see the high and the low of that area. They often look like the image of a thermal camera, which is where the name comes from. Of course, a heatmap can also be used for displaying different temperatures, as its name so aptly describes. In this example we want to do that. We have the monthly mean temperature for a city for the last 10 years and we want to display this temperature by colors in a heatmap. </p>



<h2 class="wp-block-heading">The Data</h2>



<p>To do this, we first create an array in which we write the years we have and an array with the individual month names: The information in these arrays will be needed later for the labelling of the axes. </p>



<p>In order to be able to display values in a diagram, we want to write the values into a single array with all the months following with their values. We will combine the values as follow:&nbsp;</p>



<pre class="wp-block-preformatted">Array( Jan ( 0 ) … Jan ( 9 ) , Feb ( 0 ) … Feb ( 9 ) , Mar ( 0 ) … , … Dec ( 9 ) )</pre>



<p>We start with the January values and append the other months behind it. We can highlight special parts of the heatmap by adding a star, a polygon or a cross of any color to the area.&nbsp;</p>



<h2 class="wp-block-heading">Creating the Heatmap</h2>



<p>Now we come to the creation of the actual diagram. We create an area 600 x 500 pixels in size; on this area we will later draw our chart and the legend. To do this, we create an instance of the class&nbsp;<a href="https://www.monkeybreadsoftware.net/class-cdxychartmbs.shtml">CDXYChartMBS</a>&nbsp;and pass the size in the parameters.&nbsp;</p>



<pre class="wp-block-preformatted">Dim c As New CDXYChartMBS(600, 500)</pre>



<p>Above the chart, with addTitle, we can add a title that describes our chart. Our chart should be on an area of 400 x 400 pixels and have a distance of 80 pixels from the top edge. The background color, as well as the grid color is transparent.&nbsp;</p>



<pre class="wp-block-preformatted">Dim p As CDPlotAreaMBS = c.setPlotArea(80, 80, 400, 400, -1, -1, CDBaseChartMBS.kTransparent, CDBaseChartMBS.kTransparent)</pre>



<p>Now our symbol for minimum temperature is added. The minimum temperature is a small circle in a light blue color. In the addScatterLayer method we first specify the X and Y coordinate arrays as parameters then the title that will later be displayed in the legend next to the diagram and the shape of the symbol. Here we use PolygonShape. The number in the brackets behind the shape indicates the number of sides of the polygon. If this is 0, we see a circle. Then in the parameters follows the size of the symbol and the color. The structure is the same for other marks.</p>



<pre class="wp-block-preformatted">Call c.addScatterLayer(symbolX, symbolY, "Min value", CDBaseChartMBS.PolygonShape(0), 15, &amp;hc6e2ff)</pre>



<p>Now we create the heatmap with the method addDiscreteHeatMapLayer. It should have a size of 10 x 12 cells. 10 cells on the x axis and 12 cells on the y axis. In the parameters we first specify the array with the data and then the amount of cells on the x axis. For this we have to determined the array size of the array of the years. The cell amount for y axis is automatically determined from the amount of data. </p>



<pre class="wp-block-preformatted">Dim layer As CDDiscreteHeatMapLayerMBS = c.addDiscreteHeatMapLayer(zData, xLabels_size)</pre>



<p>We now set the labels for the axes. With the method setLabels we specify the text. With the method xAxis.setLabelStyle we specify the font and the font color. The label should be rotated by 90 degrees on the x axis so that it is easier to read. With setLabelOffset we set the distance of the text to the grid border. With a value of 0, the text would be on the left or upper edges of the cell and not in the middle. With setXAxisOnTop we indicate that the text of the x axis should be above the diagram. </p>



<p>The setting of the y axis labels is similar</p>



<pre class="wp-block-preformatted">Call c.xAxis.setLabels(xLabels) 
Call c.xAxis.setLabelStyle("Arial Bold", 10, CDBaseChartMBS.kTextColor, 90) c.xAxis.setColors(CDBaseChartMBS.kTransparent, CDBaseChartMBS.kTextColor) 
c.xAxis.setLabelOffset(0.25) 
c.setXAxisOnTop 

Call c.yAxis.setLabels(yLabels) 
Call c.yAxis.setLabelStyle("Arial Bold", 10) c.yAxis.setColors(CDBaseChartMBS.kTransparent, CDBaseChartMBS.kTextColor) 
c.yAxis.setLabelOffset(0.25) 
c.yAxis.setReverse</pre>



<p>Now we want to specify the individual colors for the value ranges. For this we create a new array. In this array we first enter the lower limit of the temperature that the color should describe, then the color value in hexadecimal followed by the uppermost value. The uppermost value is at the same time the lowermost value of the next color, so we don&#8217;t enter it twice, but give directly the next color. Our values all have a distance of 3 degrees. Afterwards we create the array colorLabels, which describes the text for our legend</p>



<pre class="wp-block-preformatted">Dim colorScale() As Double = Array(0.0, &amp;h104E8B, 0.0, &amp;h00BFFF, 3.0, &amp;h7FFFD4, 6.0, &amp;hFFFF00, 9.0, &amp;hFFC125, 12.00, &amp;hFF7F00, 15.00, &amp;hff4500, 18.00, &amp;hcd0000, 21.00,&amp;h8B0000, 21.10) 
Dim colorLabels() As String = Array("&lt;0.0", "0.0-3.0", "3.1-6.0", "6.1-9.0", "9.1-12.0", "12.1-15.0", "15.1-18.0", "18.1-21.0", „>21.0“)</pre>



<p>We then apply the colors with colorAxis.setColorScale on the layer level.</p>



<pre class="wp-block-preformatted">layer.colorAxis.setColorScale(colorScale)</pre>



<p>We place the legend 20 pixels to the right of the diagram. We use the font Arial Bold in size 10. With setKeySize we set the size of the legend boxes and with setKeySpacing the vertical distance between the individual legend entries.</p>



<pre class="wp-block-preformatted">Dim b As CDLegendBoxMBS = c.addLegend(p.getRightX + 20, p.getTopY, True, "Arial Bold", 10) 
b.setBackground(CDBaseChartMBS.kTransparent, CDBaseChartMBS.kTransparent) 
b.setKeySize(15, 15) 
b.setKeySpacing(0, 8) 
b.addText("Temp in °C“)</pre>



<p>For the colors we use a trick, we read only the colors from the array that contains the color values and the temperature ranges by looking only at every second value. With the method addKey we then add the tag with the name and the extracted color.&nbsp;</p>



<pre class="wp-block-preformatted">For i As Integer = colorLabels_size - 1 DownTo 0 
 Dim n As Integer = colorScale(i * 2 + 1) 
 b.addKey(colorLabels(i), n) 
Next</pre>



<p>With the method makeChartPicture we get our diagram as picture:</p>



<pre class="wp-block-preformatted">pic = c.makeChartPicture</pre>



<p>And you can show this picture as backdrop to better draw it with the paint event. If you use MakeChart with PDF type as parameter, you can get a PDF file to embed in a PDF page as vector graphics.</p>



<p>Then we can run the program and see our heatmap. You can then continue to work with this heatmap according to your own preferences. The final heat map looks like this:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="758" src="https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap-1024x758.jpg" alt="" class="wp-image-8808" srcset="https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap-1024x758.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap-300x222.jpg 300w, https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap-768x568.jpg 768w, https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap-1536x1136.jpg 1536w, https://blog.xojo.com/wp-content/uploads/2021/07/tempheatmap.jpg 1668w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>As I mentioned at the beginning of this post, you&#8217;ll need the <a href="https://www.monkeybreadsoftware.de/xojo/plugin-chartdirector.shtml">MBS Xojo ChartDirector Plugin</a> which you can purchase on the MonkeyBread Software website; or, at the moment, it&#8217;s included in super the <a href="http://omegabundle.net/">Omegabundle</a> deal. Besides ChartDirector, Omegabundle includes a ton of other tools for the sensational price of 399.99$. For example, you also get a DynaPDF Starter license with which you can use to write the chart into a PDF file. If you want to attend the Xojo Developer Conference 2022 in London and meet us, Omegabundle includes a discount of 100$ for the conference! Read articles from the Xdev developer magazine on the way to the conference, because it&#8217;s also included in the bundle! Have a look at the <a href="http://omegabundle.net/">Omegabundle</a>. It&#8217;s worth it. I hope you enjoy the heatmap!</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">Monkeybread Software.</a> You may have also read her articles in <a rel="noreferrer noopener" href="http://www.xdevmag.com/" target="_blank">Xojo Developer Magazine</a>. </em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pump Up Your Xojo Development</title>
		<link>https://blog.xojo.com/2021/05/03/the-xojo-extras-store/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Mon, 03 May 2021 09:12:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AprendeXojo]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Ohanaware]]></category>
		<category><![CDATA[Third Party]]></category>
		<category><![CDATA[xDev Magazine]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7746</guid>

					<description><![CDATA[During this week's May Sale all Xojo licenses and everything in the Xojo Extras Store are discounted 20%! What kind of deals and extras are out there? Let's check them out! There are 5 categories of Xojo Extras: Developer Tools, User Interface, Database, Distribution and Learning.]]></description>
										<content:encoded><![CDATA[
<p>During this week&#8217;s May Sale all Xojo licenses and everything in the Xojo Extras Store are discounted 20%! What kind of deals and extras are out there? Let&#8217;s check them out. There are 5 categories of Xojo Extras: Developer Tools, User Interface, Database, Distribution and Learning.</p>



<h2 class="wp-block-heading"><strong>Developer Tools</strong></h2>



<p><strong>piDog DataView</strong> is a fast and flexible list viewer and includes one year of updates.</p>



<p><strong>Markdown Parser</strong> for Xojo is a class that allows you to implement the ability to parse Markdown source text into HTML + the provided CSS styles, so it can be presented on the fly over an HTML control for its use &#8220;as-is&#8221;, as a starting point for invoices, reports, templates or document conversion. </p>



<p>If you don&#8217;t have anything from Monkeybread Software, then this is a great deal for you! Everything is 20% off from the <strong>Complete Plugin Set</strong>, which includes 54,000+ functions, to <strong>DynaPDF</strong> for creating and editing PDF documents and more.</p>



<p><strong>Mime Parser</strong> is a class for parsing emails.</p>



<p>The <strong>OMP Plugin</strong> allows you to easily parse Microsoft Outlook Structured Storage (.MSG) files cross-platform from Xojo.</p>



<p>Also offered is a <strong>Spell Checker Class</strong> to easily spell check text.</p>



<h2 class="wp-block-heading">User Interface</h2>



<p><strong>ARWaitingView</strong> is a class to prevent the user from navigating the interface while something is downloading or doing a long process. </p>



<p><strong>AXControlGrid</strong> is a complete and powerful Xojo desktop UI component for macOS and Windows that it makes possible to put Canvas-based controls in a Page or a series of Pages of a given size and, optionally, their associated captions.</p>



<p><strong>AXImageCanvas </strong>greatly simplifies the task of displaying a Picture with the ability to correctly display the image maintaining its original aspect ratio, and keeping the full resolution of the picture and reference to the original FolderItem.</p>



<p><strong>AXNumValidatedTF</strong> is a Xojo TextField subclass (32/64 bits) for Windows and macOS allowing the input validation of a defined numeric range, using the system Locale settings for decimal and grouping text formatting.</p>



<p>Antonio Rinaldi offers <strong>Doughnut</strong>, which is an extension for iOSGraphics to draw circular graphs. Additionally, <strong>iOSTableViewExtended</strong> is a subclass that adds useful features including: swipe to reload, table header and footer, customer section header and footer, contextual menus, side index, TextEdit fix and more.</p>



<p><strong>GraffitiSuite</strong> All Access, Desktop and Web are on sale! They are a collection of custom components for Xojo Desktop and Web. </p>



<p>MBS <strong>ChartDirector</strong> lets you create professional charts in Xojo, with 30 chart and gauge types.</p>



<p><strong>RubberViews</strong> from Match Software maintains the place and relative size of every control when a Window or Container Control is resized. They also offer Window Placement and Screen Extensions that are modules that let you manage windows with greater control.</p>



<h2 class="wp-block-heading">Database</h2>



<p><strong>DataViewer Component </strong>is a collection of objects for Xojo that can easily incorporate into your own projects to give SQL Query and DML functionality for SQLite and MySQL databases along with Data Export facilities. Full source code edition also available.</p>



<p>The<strong> MBS SQL Plugin</strong> is an alternative database interface to Xojo that gives access to SQL databases including Oracle, Microsoft SQL Server, DB2, Sybase, Informix, InterBase/Firebird, SQLBase, MySQL, PostgreSQL, ODBC and SQLite. Also available is the <strong>MBS SQLite Extension</strong> is a plug-in for cubeSQL Server, a plug-in for SQLite Manager (sqlabs) and an extension for SQLite that you can use in all SQLite-based database engines, including the SQLiteDatabase class in Xojo.</p>



<p><strong>SQLVue</strong> is the fast and easy way to manage your SQLite databases.</p>



<h2 class="wp-block-heading">Distribution</h2>



<p><strong>App Wrapper </strong>from Ohanaware simplified the process of preparing applications for submission to the Mac App Store and deploying on websites. Get a 30-day or a 1 year single user or team update plan during this limited time offer.</p>



<p><strong>BoxedApp Packer</strong> helps Xojo developers prepare a single executable file that contains all required files a Xojo application needs.</p>



<p>The <strong>GuancheMOS</strong> plug-in is a serial number creation and validation Engine. Also available is <strong>GuancheID</strong>, the easiest way to get a unique ID for macOS and Windows based computers, so you can use it in combination with GuancheMOS or your own software licensing scheme to make sure your software only runs on the computer the license has been generated for.</p>



<p><strong>Quick License Manager</strong> protects your Xojo Windows application with licensing for trials, perpetual or subscription-based licenses.</p>



<h2 class="wp-block-heading"><strong>Learning</strong></h2>



<p><strong>AprendeXojo</strong> has 2 Spanish-language ebooks in the store available for $20 each during the sale:&nbsp;<em>Programación Multiplataforma Xojo</em>&nbsp;and&nbsp;<em>SQLite</em>.</p>



<p><strong>xDev Magazine</strong> is an&nbsp;independent bimonthly publication focused on educating Xojo users through instruction, tutorials and programming. Score a 1 year subscription during the sale for just $40!</p>



<h2 class="wp-block-heading">Shop Now</h2>



<p>The <a href="https://www.xojo.com/store">Xojo Extras store</a> has something for every kind of Xojo developer, whether you are learning something new or looking to save some time implementing something tricky. Take a look now to see what can help make your development life easier! The Xojo May Sale runs until midnight (CT) Friday, May 7th.  </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Building a weather station with MBS by using a JSON API</title>
		<link>https://blog.xojo.com/2020/10/01/building-a-weather-station-with-mbs-by-using-a-json-api/</link>
		
		<dc:creator><![CDATA[Stefanie Juchmes]]></dc:creator>
		<pubDate>Thu, 01 Oct 2020 14:48:13 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7550</guid>

					<description><![CDATA[Learn how to retrieve the data of an API over a CURL connection and evaluate the JSON to build a weather station. This example uses a free key from the OpenWeather API. The API returns a JSON text containing information such as current weather description, current temperature, pressure, humidity and many more. ]]></description>
										<content:encoded><![CDATA[
<p>I want to show you how to retrieve the data of an API over a CURL connection and evaluate the JSON to build a weather station.</p>



<p>In this example I work with a free key from the OpenWeather API. OpenWeather provides an API with weather data that you can access by an URL. The API returns a JSON text containing information such as current weather description, current temperature, pressure, humidity and many more. This is uses the CURL Plugin for the network query and Util plugin for JSON.</p>



<p><strong>The Layout&nbsp;</strong></p>



<p>We want to take a closer look at this JSON together later. But first we want to build the layout in which we can enter our weather information. This layout basically consists of two areas, one is the data area where our information will be displayed and the other is our area where we can enter the location of the wanted forecast and the unit of measurement for the temperature.&nbsp;</p>



<p>We start with the settings area. Here there must be a text field for the location. To set the temperature unit we use a popup menu.&nbsp;</p>



<p>The popup menu has the following entries: °C, °F and K. So later you should be able to choose between Celsius, Fahrenheit and Kelvin as display unit. °C is the default value of the popup menu. In the event &#8220;Change&#8221; of this popup menu we write the selected unit into a property which we can later need in the program. The default value of the property is &#8220;C&#8221; and stands for the unit Celsius. The code of the event then looks like this:&nbsp;</p>



<pre class="wp-block-preformatted"> If PopupMenu1.SelectedRowValue="°C" Then
  TempUnit="C"
Elseif PopupMenu1.SelectedRowValue="°F" Then
  TempUnit="F"
Else
  TempUnit="K"
end if </pre>



<p>We also need a button with which we can start the search.&nbsp; So we are done with the layout in the settings area. Of course this area can also be decorated and highlighted.&nbsp;</p>



<p>Now let&#8217;s get to the layout of the data area. We first need to know which data should be displayed.&nbsp;</p>



<p>You can visit the <a href="https://openweathermap.org/current" target="_blank" rel="noreferrer noopener">OpenWeather website</a> for more details about the available information. In our application the following information should be displayable:</p>



<p>*Weather description<br>*Current temperature<br>*Perceived temperature<br>*Minimum temperature<br>*Maximum temperature<br>*Humidity<br>*Wind speed<br>*Atmospheric pressure<br>*Sunrise and sunset time  </p>



<p>We create a separate label for each of these information.&nbsp;Information behind which a unit of measurement should be placed, gets an additional label field with the unit of measurement. The unit of measurement fields for the temperatures are all named the same, so we create an array of labels. This is important, because these units of measurement are to be changed afterwards by script. Of course the inscription must not be missing, so that we can see what information is actually displayed. These can then also be decorated appropriately.&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="761" src="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1-1024x761.png" alt="" class="wp-image-7554" srcset="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1-1024x761.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1-300x223.png 300w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1-768x571.png 768w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1-1536x1141.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-1.png 1680w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>The CURL Connection to the API&nbsp;</strong></p>



<p>When we have entered a location and clicked on the search button, the matching values should appear. Now we have to think about where we get our current weather data. As mentioned before we work with the OpenWeather API. To access this API we pass some information with our URL like the desired location and our key. The structure of the URL can look like this:</p>



<p>api.openweathermap.org/data/2.5/weather?q={city name}&amp;appid={your api key}</p>



<p>The informations in the curly brackets must be replaced with your wanted query. For example you want the current weather information for London, where the next Xojo conference will take place and your key would be „123“ the url look like this&nbsp;</p>



<p><a href="http://api.openweathermap.org/data/2.5/weather?q=London&amp;appid=123">api.openweathermap.org/data/2.5/weather?q=London&amp;appid=123</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="279" src="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-1024x279.png" alt="" class="wp-image-7555" srcset="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-1024x279.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-300x82.png 300w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-768x209.png 768w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-1536x419.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-2-2048x558.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>example result of the URL with a valid key</figcaption></figure>



<p>The result that the URL returns is a JSON text, that contains the requested informations. So we need the text in our program. For this we use a CURL connection. We build it in the action event of the search button and pass the URL&nbsp;</p>



<p><strong>Action Event:&nbsp;</strong></p>



<p><em>Dim c As New MyCURL<br>c.OptionURL = &#8220;api.openweathermap.org/data/2.5/weather?<br>q=&#8221;+Search.Text+&#8221;&amp;appid=&#8221;+Key<br>Call c.Perform </em></p>



<p>In the code we see that we create a new instance of the MyCurl class. The <strong>MyCurl </strong>class has the superclass <strong>CURLSMBS</strong>. We need the new class because we want to fill events with code.&nbsp;</p>



<p>Then we build our URL. We pass the location that is contained in the search text field. Our key is in a property. This has the advantage that we only have to change it in one place and don&#8217;t have to search in the source code in case we would query several URLs. At this point it should be mentioned that the Open Weather API can find the weather not only by place name, but also by longitude and latitude, City ID or ZipCode.</p>



<p>Besides the current weather data, forecasts and much more can be called up. When using an API, it is always useful to have a look at the documentation of an API to be able to use it correctly.</p>



<p>The <strong>Perform</strong> method calls the specified URL. In the event <strong>Write</strong> of the <strong>MyCurl</strong> class we get the data of the url. We save the data in the property JSONText as String, because we need this text in different scripts. Then we test if we get valide weather data. E.g. Our key can be wrong or the city is not found. For that test we write a method <strong>test</strong>, that return a boolean value. If the return value is true we run the method <strong>run</strong>, that set the informations form the API to our labels. If the result is false, we display in a message Box an error code that is save in a property Error.&nbsp;</p>



<p><strong>Write Event:&nbsp;</strong></p>



<pre class="wp-block-preformatted">weather.JSONText=data<br> Dim c As Boolean=weather.test
If c Then
  weather.run
Else 
  MsgBox weather.Error 
End If  </pre>



<p>So let’s start to write the method <strong>test</strong> as first.&nbsp;</p>



<p>Let&#8217;s think about what could go wrong: For example our API key might be wrong. Let&#8217;s enter our URL in the browser and change a character in the key so that it doesn&#8217;t match ours. The result looks like this:&nbsp;</p>



<pre class="wp-block-preformatted">{"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info.“}</pre>



<p>We get a code number and an error message as result. The same we can test for a wrong city name&nbsp;</p>



<pre class="wp-block-preformatted">{"cod":"404","message":"city not found“}</pre>



<p>Also here we get only these two keys. We look whether there are also these keys with a normal and valid, functioning query. The answer is yes! In a validquery the key „cod“ always has the value 200, also for different Cities in different Countries. We can use this. So we check whether cod has the value 200. If it is not equal, there was an error and we save the text under the key message in the property Error. This text will be written into a dialog in the Write event. Otherwise the method returns true.&nbsp;</p>



<p><strong>Method test()as boolean :</strong></p>



<pre class="wp-block-preformatted">Dim json As New JSONMBS(JSONText)<br> Dim cod As JSONMBS =json.Child ("cod")
If cod.toString <>"200" Then
  Dim message As JSONMBS= json.Child ("message")
  Error=message.toString
  Return False
Else
  Error=""
  Return True
End If </pre>



<p>So we first create a new instance of the class <strong>JSONMBS</strong>, to which we pass our JSON from the API.&nbsp;</p>



<p>We want the result of „cod&#8221;. We can compare it. We call the method <strong>Child</strong>, which we pass the key as parameter. The result is again of type <strong>JSONMBS</strong>. To be able to read the result, we call the method <strong>toString</strong> to convert the result to a string that we can compare.&nbsp;</p>



<p>If the result is not equal 200, we use again the method <strong>Child</strong> to get the information from the key „message“ and read the information with <strong>toString</strong>.</p>



<p><strong>Working with the JSON&nbsp;</strong></p>



<p>We now come to the already used method run.&nbsp;</p>



<p>In this method we first enter the units of temperature into the labels. Then we create a new instance of the JSONMBS class, that gets the JSON text from the API.&nbsp;</p>



<pre class="wp-block-preformatted">For i As Integer= 0 To 3<br>   deg(i).Text= PopupMenu1.SelectedRowValue
Next

Dim json As New JSONMBS(JSONText) </pre>



<p>This instance is used for all data queries. The idea of the data query is always the same. We look at the original JSON where the information we want to read is. e.g. the description text of the weather. We go backwards and note the path&nbsp;</p>



<pre class="wp-block-preformatted"><em>…<br> "weather":[
      {
         "id":804,
         "main":"Clouds",
         "description":"overcast clouds",
         "icon":"04d"
      }
   ],
… </em></pre>



<p>The description text is located under the key description. Description is located in an array. In the array, the desired description is in the first element. (Note that an array starts counting at 0) The array is located in the object weather. So we can build the path from right to left as follows&nbsp;</p>



<p><strong>weather[0].description</strong></p>



<p>We now unravel this path with various methods and go deeper layer by layer. We start with weather. This key is a Child of or JSON Text. Because of this we write :</p>



<pre class="wp-block-preformatted">Dim weather As JSONMBS= json.Child („weather“)</pre>



<p>Now the variable has the following content&nbsp;</p>



<pre class="wp-block-preformatted"><em>"weather":[
      {
         "id":804,
         "main":"Clouds",
         "description":"overcast clouds",
         "icon":"04d"
      }
   ],</em></pre>



<p>Next we need to get into the array. We need the first element. We use the method ArrayItem and pass 0 as parameter, because we want to address the first element with the index 0.</p>



<pre class="wp-block-preformatted">Dim weatherArray As JSONMBS=weather.ArrayItem(0)</pre>



<p>The JSON in weatherArray has the following structure:&nbsp;</p>



<pre class="wp-block-preformatted"><em>&nbsp; {<br> "id":804,
         "main":"Clouds",
         "description":"overcast clouds",
         "icon":"04d"
      } </em></pre>



<p>Now the description is again a child of this object. And we use the Child method again&nbsp;</p>



<pre class="wp-block-preformatted">Dim description As JSONMBS= weatherArray.Child(„description“)</pre>



<p>Now we have to put the JSON text as MBSJSON datatype into a format that can be read.&nbsp; For this we use the <strong>toString</strong> method. Now we have a string that still has quotation marks, which we can replace with an empty string by using the <strong>ReplaceAll </strong>method.</p>



<pre class="wp-block-preformatted">weatherDes.Text=ReplaceAll(description.toString, Chr(34),"")</pre>



<p>The paths of the other information can be read and build similarly.</p>



<p><strong>Convert the temperature&nbsp;</strong></p>



<p>We get the temperatures by default in Kelvin. You can change this with an addition in the URL. But because we want to choose between Kelvin, Celsius and Fahrenheit anyway, we mostly have to convert the extracted results into the desired unit. So we pass any temperature we get from the API to the <strong>tempConvert</strong> method. This method has as input the temperature as a double</p>



<p>In If and Else If statements we check which temperature unit is selected in the popup menu. Matching this we do the conversion. The formulas are as follows:</p>



<p><strong>Kelvin -&gt; Fahrenheit&nbsp;</strong><br>Fahrenheit= Kelvin*(9/5)-459.67 </p>



<p><strong>Kelvin -&gt;Celsius&nbsp;</strong><br>Celsius= Kelvin -273</p>



<p><strong>Kelvin-&gt; Kelvin&nbsp;</strong><br>Kelvin = Kelvin</p>



<p>These conversions can of course result in unwanted decimal digits. Therefore we format to the first digit after the decimal point and return this value. The Code of this method look like this:&nbsp;</p>



<p><strong>tempConvert (temp as double) as double:</strong></p>



<pre class="wp-block-preformatted">Dim tempConv As Double
<br> If tempunit="F" Then 
   tempConv = temp*(9/5)-459.67
Elseif tempunit="C" Then 
   tempConv = temp-273.15
Else
   tempConv = temp
End If 
tempConv=Format(tempConv, "#.#").Val

Return tempConv </pre>



<p>A further conversion is needed for the sunset and sunrise time. We have given the times in Unix time. That means we have given the seconds from January 1st 1970 00:00 to the time of our time value. We have to convert this into a time that is readable for humans. The code for the sunrise look like this.&nbsp;</p>



<pre class="wp-block-preformatted"> Dim d1 As New DateTime(rise.ValueInteger, TimeZone.Current)
sunrise.Text=d1.Hour.ToString+":"+d1.Minute.ToString</pre>



<p>The code for the sunset looks similar.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="877" src="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-3-1024x877.png" alt="" class="wp-image-7557" srcset="https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-3-1024x877.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-3-300x257.png 300w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-3-768x658.png 768w, https://blog.xojo.com/wp-content/uploads/2020/09/weather-station-3.png 1256w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>the weather in London</figcaption></figure>



<p>Now I wish you a lot of fun with your own weather station. Download the project <a href="https://blog.xojo.com/wp-content/uploads/2020/09/Weather-Station-Example.zip" target="_blank" rel="noreferrer noopener">here</a> and if you have any questions please feel free to contact me. </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">Monkeybread Software.</a> You may have also read her articles in <a rel="noreferrer noopener" href="http://www.xdevmag.com/" target="_blank">Xojo Developer Magazine</a>. </em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Professional Charts in Xojo with ChartDirector</title>
		<link>https://blog.xojo.com/2020/07/27/professional-charts-in-xojo-with-chartdirector/</link>
		
		<dc:creator><![CDATA[Stefanie Juchmes]]></dc:creator>
		<pubDate>Mon, 27 Jul 2020 18:33:55 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Charts]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Third Party]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7193</guid>

					<description><![CDATA[Do you want to work with chart in your Xojo application? You can use the MBS ChartDirector Plugin in conjunction with the ChartDirector library to display charts.]]></description>
										<content:encoded><![CDATA[
<p>Do you want to work with chart in your Xojo application? You can use the <a href="https://www.monkeybreadsoftware.de/xojo/plugin-chartdirector.shtml">MBS ChartDirector Plugin</a> in conjunction with the ChartDirector library to display charts. In this article I would like to show you some examples that demonstrate some possibilities you have to create charts.</p>



<p>In this example we create a pie chart. A pie chart has one-dimensional data, that means that we need to filled <strong>one</strong> array with data. Here is our example:&nbsp;</p>



<p>Imagine a bakery making $1,500 a day. We now want to read from our chart what percentage of the profit is made by bread, buns, cakes and cookies. For this we enter in our array the 600$ of bread, 335$ of buns, 309$ of cake and 256$ of cookies.&nbsp;</p>



<p>So our array definition looks like this:&nbsp;</p>



<p><em>Dim data(-1) As Double = Array (600, 335, 309, 256)</em></p>



<p>We don&#8217;t have to worry about the percentage, because it is automatically calculated based on the specified array.&nbsp;</p>



<p>Now we create another array with the corresponding labels. It must be ensured that the label sequence corresponds to the order of the data sequence.&nbsp;</p>



<p><em>Dim labels(-1) As String = Array (&#8220;Bread&#8221;, &#8220;Buns&#8221;, &#8220;Cake&#8221;, &#8220;Cookies&#8221;)</em></p>



<p>We also arrange the colors of the individual circle sections as an array. Here is a small tip: You can use already known color combinations, lists of color combinations that harmonize well with each other can be found in the Internet in large numbers.&nbsp;</p>



<p>I have chosen a combination of pink and purple tones:&nbsp;</p>



<p><em>Dim colors(-1) As Integer<br>
colors.Append &amp;hBB397A <br>
colors.Append &amp;h7B448D <br>
colors.Append &amp;hDE69A5<br>
colors.Append &amp;h9672c6</em></p>



<p>Then we create our diagram working environment.&nbsp;</p>



<p><em>Dim c As New CDPieChartMBS(600, 400, &amp;hffffff, &amp;hffffff, 0)</em></p>



<p>In the parameters we can set the height and width of the working environment, the background color, the edge color and the stars of the elevation effect.&nbsp;</p>



<p>In the image you can see a working environment with a red background, blue edge color and the elevation of 5, additionally the corners have been rounded with the method <em>setRoundedFrame</em>.</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/07/Picture-1-1024x768.png" alt="" class="wp-image-7194" srcset="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-1-1024x768.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-1-300x225.png 300w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-1-768x576.png 768w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-1.png 1424w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>But for our example we take a white background.</p>



<p>Then we can insert the title of the diagram that should appear in the middle of the upper side. In the parameters we can set the text, font, font size, font color, font box background color and the text box border color. In our example we define only the text and leave the remaining parameters at the default values.</p>



<p><em>call c.addTitle(&#8220;Pie Chart Demonstration&#8221;)&nbsp;</em></p>



<p>Now we can make some settings for the chart.</p>



<p>First we define the size and position of the pie chart.&nbsp;</p>



<p><em>c.setPieSize(300, 200, 110)</em></p>



<p>Our working area has a size of 600&#215;400 which means that if we want to position the chart in the middle of our working area we have to halve these values so we get 300 and 200 which we then specify in the parameters. The third parameter describes the size of the pie chart with the radius. If we had a ring chart instead of a pie chart, the inner radius would be given in a fourth parameter and the called function would be <em>setDonutSize</em>.&nbsp;</p>



<p>Afterwards we can specify the color of the data areas.&nbsp;</p>



<p>In the first parameter we specify that we want to set the data color, because the <em>SetColors</em> method can be used in many more areas. In the second parameter we specify the already created array <em>colors </em>:</p>



<p><em>c.setColors(c.kDataColor, colors)</em></p>



<p>Then we can set that our pie chart should be shown as a 3D figure and with the command:&nbsp;</p>



<p><em>c.set3D(deeps, 45, False) </em></p>



<p>Set the heights of the segments so that they look like stairs and the angle with which we look at the chart. The point of view depends on the shadow mode, which is switch off by default.&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="729" src="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-1024x729.png" alt="" class="wp-image-7195" srcset="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-1024x729.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-300x214.png 300w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-768x547.png 768w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-1536x1093.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-2-2048x1458.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="729" src="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-1024x729.png" alt="" class="wp-image-7196" srcset="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-1024x729.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-300x214.png 300w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-768x547.png 768w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-1536x1093.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-3-2048x1458.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>With Shadow Mode (2) and without Shadow Mode (3)</p>



<p>We prefer that the angle of the first segment does not start straight up, for this we use the <em>SetStartAngle</em> method. Also, the individual segments should not stick to each other and there should be a small gap between them. We want to highlight the largest segment a bit more and move it further out. In the <em>SetExplode</em> method we first specify the data segment we want to push out of the circle and the amount by which it should be pushed out:</p>



<p><em>c.setStartAngle(-20)<br>c.setExplode(0, 20)<br>c.setExplode(1, 20)<br>c.setExplode(2, 2)<br>c.setExplode(3, 2)</em></p>



<p>So that our data can also be displayed we have to pass the data to the diagram. With <em>SetData</em> we specify the data and assign the right labels to them. Both informations we find in the already prepared arrays:</p>



<p><em>c.setData(data, labels)</em></p>



<p>Our labels do not look handsome yet. We would like to change that now by defining their style. The label name should be italic, bold and a little bit bigger, than the other labels. Underneath it should be the given value in US$ and in brackets behind it the percentage value</p>



<p>The definition of this style is as given here in a format string:</p>



<p><em>c.setLabelFormat(&#8220;&lt;*block,halign=left*&gt;&lt;*font=timesbi.ttf,size=12,underline=0*&gt;{label}&lt;*/font*&gt;&lt;*br*&gt;US$ {value} ({percent}%)&#8221;)&nbsp;</em></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="729" src="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-1024x729.png" alt="" class="wp-image-7197" srcset="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-1024x729.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-300x214.png 300w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-768x547.png 768w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-1536x1093.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-4-2048x1458.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>In the style sting we first define the text alignment. This should be left-aligned. Then we specify timerbi.ttf as font. This font is already italics and bold (recognizable by the b and i at the end). In addition, we specify the font size with 12 and that the text is not underlined. These specifications refer to the label text. This is specified with <em>{label}</em> in the style string. After a line break the text <em>US$</em> and the value of the segment that is specified with <em>{value} </em>is following. In the default case it is assumed that the value is a number. But if it is a date we can format it with the following additions: <em>{value|mm/dd/yyyyy}</em>, <em>{value|mm/yyyyy}</em> or <em>{value|yyyyy}</em>. In our example, the percentage with <em>{percent}</em> in brackets follows.</p>



<p>If you want your segment description texts to be highlighted in the individual segment colors and have lines to the individual segments, you can add the following line:</p>



<p><em>c.setLabelLayout(c.kSideLayout)</em></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="729" src="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-1024x729.png" alt="" class="wp-image-7198" srcset="https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-1024x729.png 1024w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-300x214.png 300w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-768x547.png 768w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-1536x1093.png 1536w, https://blog.xojo.com/wp-content/uploads/2020/07/Picture-5-2048x1458.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Finally, we want to display our diagram in the window as a background picture. To do this, we adjust our window size to the size of the diagram. Then we create a picture with the method makeChartPicture, which we then set as the backdrop.&nbsp;</p>



<p><em>w.Height = c.getHeight<br>w.Width = c.getWidth<br>w.Backdrop = c.makeChartPicture</em></p>



<p>Of course we could have used the picture also to write it into a file. For this we can use the method <em>Save</em> in combination with a folder item or we could have used the picture to insert it into a PDF file with <a href="https://www.monkeybreadsoftware.de/xojo/plugin-dynapdf.shtml">DynaPDF</a>.&nbsp;</p>



<p>There are many more possibilities to design charts with Chart Director, but this example should give you a short insight to the work with Chart Director.&nbsp;</p>



<p>To use these functionalities you need a license of the <a href="https://www.monkeybreadsoftware.de/xojo/plugin-chartdirector.shtml">MBS ChartDirector Plugin</a>. You get it either in the Xojo store, on our website or currently in the <a href="http://www.omegabundle.net">OmegaBundle 2020</a>.</p>



<p>I wish you a lot of fun with the charts in Xojo.&nbsp;Download the project.</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;</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Building an RFC interface with MBS Xojo Plugin to SAP R/3 or SAP S/4 HANA</title>
		<link>https://blog.xojo.com/2020/05/28/building-an-rfc-interface-with-mbs-xojo-plugin-to-sap-r-3-or-sap-s-4-hana/</link>
		
		<dc:creator><![CDATA[Michael Eckert]]></dc:creator>
		<pubDate>Thu, 28 May 2020 10:00:00 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Enterprise Software]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[Third Party]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7032</guid>

					<description><![CDATA[With the RFC classes of the MBS Xojo Tools Plugin you can build RFC interfaces to SAP systems.]]></description>
										<content:encoded><![CDATA[
<p>If you work with large companies, you&#8217;ve most likely heard of SAP, a widely used enterprise software solution. With the RFC classes of the <a href="https://www.monkeybreadsoftware.de/xojo/plugins.shtml">MBS Xojo Plugin</a> you can build RFC (Remote Function Call) interfaces so that Xojo apps can communicate with SAP systems. I’ve done this to SAP R/3 and SAP S/4 HANA. The MBS plugin covers the libraries of the SAP NetWeaver RFC SDK 7.50.</p>



<h3 class="wp-block-heading">The SAP interface has four steps:</h3>



<ol class="wp-block-list"><li>Determine the path to the SAP library&nbsp;</li><li>Build a connection to the SAP system</li><li>Transfer data to the SAP system</li><li>Receive data from the SAP system</li></ol>



<h3 class="wp-block-heading">Connect the SAP System</h3>



<p>Your SAP user must have the authority for RFC connections. If so, you must know some data of your SAP logon to connect to an SAP system, such as:</p>



<ul class="wp-block-list"><li>host name &#8211; a name or an IP address (ashost)</li><li>router string&nbsp;</li><li>system number (sysnr)</li><li>client (client)</li><li>language (lang)</li><li>user (user)</li><li>password (passwd)</li></ul>



<p>At first you must set the path to the SAP libraries. In Windows you have some DLL’s around SAPNWRFC.DLL and on macOS you have some DYLIB’s around LIBSAPNWRFC.DYLIB.</p>



<pre class="wp-block-preformatted">If TargetWin32
  var LibFile as string = "sapnwrfc.dll"
Else
  // get the actual folder and handle the exception
  var MacOsFolder as folderitem = app.ExecutableFile.Parent
  System.EnvironmentVariable("DYLD_LIBRARY_PATH") = MacOsFolder.NativePath
  If System.EnvironmentVariable("DYLD_LIBRARY_PATH") = "" Then
    MessageBox("DYLD_LIBRARY_PATH variable not set")
    return
  end if
  var LibFile as FolderItem = MacOsFolder.Child("libsapnwrfc.dylib")
  var LibPath As String = LibFile.parent.NativePath
  Call RFCModuleMBS.SetCurrentWorkingDirectory(libPath)
EndIf</pre>



<p>I’ve copied the SAP libraries with the Xojo build settings into the application resource folders.&nbsp;</p>



<p>If the setting of the LibPath fails then send the error message:</p>



<pre class="wp-block-preformatted">If not RFCModuleMBS.LoadLibrary(LibFile) Then
  // Failed to load library
  Messagebox RFCModuleMBS.LibraryLoadErrorMessage
  return
End If </pre>



<p>And if the LibPath is set you can do the logon as second step:</p>



<pre class="wp-block-preformatted">var loginParams As New Dictionary
loginParams.Value("ashost") = "12.345.67.89"
loginParams.Value("sysnr")  = "10"
loginParams.Value("client") = "100"
loginParams.Value("user")   = "MYUSERNAME”
loginParams.Value("passwd") = "MyPassword"
loginParams.Value("lang")   = "EN"
var ConnectionToSAP As New RFCConnectionMBS(loginParams) </pre>



<p>Please note if you have a router string you must build the host name (ashost) with a concatenation of router string and host name like this:</p>



<pre class="wp-block-preformatted">loginParams.Value("ashost") = &lt;router string&gt; + "/H/" + &lt;host name&gt;</pre>



<p>If the connection fails you will get the reason with:</p>



<pre class="wp-block-preformatted">Exception r As RFCErrorExceptionMBS
 MessageBox r.message </pre>



<h3 class="wp-block-heading">Calling an SAP Function Module</h3>



<p>If you are calling a SAP Function Module you will export key values to SAP and you will receive data or i.e. error messages. To understand the import and export parameters you must look out of the SAP function module in the surrounding world.</p>



<p>This example calls the SAP function module RFC_READ_TABLE. With this standard RFC module you can get the content of a database table and/or the SAP data dictionary description of this table.</p>



<h4 class="wp-block-heading">Exporting key values to SAP</h4>



<p>For exporting the key values to the SAP function module you must load a functions description and create a data container for executing the function module.</p>



<pre class="wp-block-preformatted">var fd as RFCFunctionDescriptionMBS = app.ConnectionToSAP.FunctionDescription("RFC_READ_TABLE")
var f as RFCFunctionMBS = fd.CreateFunction </pre>



<p>The function module RFC_READ_TABLE has two parameters:</p>



<ul class="wp-block-list"><li>the name of the table as import parameter: QUERY_TABLE</li><li>the select options of the where clause as tables parameter: OPTIONS</li></ul>



<pre class="wp-block-preformatted">f.StringValue("QUERY_TABLE") = "&lt;name of the table&gt;"

var it_OPTIONS as RFCTableMBS = f.TableValue("OPTIONS")
var is_OPTIONS as RFCStructureMBS

is_OPTIONS = it_OPTIONS.AppendNewRow
is_OPTIONS.StringValue("TEXT") = "(MATNR = '4711')" // WHERE clause</pre>



<p>You must consider that the maximum length of a where clause for the table OPTIONS is 72 digits. If the where clause length is greater than 72 you must split the clause to several lines. The clause must look like this “(MATNR = ‘1234’ AND WERKS = ‘1000’) OR (MATNR = ‘3456’ AND WERKS = ‘1000’)”.&nbsp;</p>



<p>And now you can execute the function module into the backend system:</p>



<pre class="wp-block-preformatted">f.invoke</pre>



<h4 class="wp-block-heading">Receiving data from SAP</h4>



<p>The function module RFC_READ_TABLE returns now to tables parameters:</p>



<ul class="wp-block-list"><li>FIELDS – contains the SAP data dictionary description of the returned table</li><li>DATA – contains the data found for the transferred where clauses</li></ul>



<pre class="wp-block-preformatted">TableFields as RFCTableMBS = f.TableValue("FIELDS")
TableData as RFCTableMBS = f.TableValue("DATA") </pre>



<p>If the TableFields.RowCount = 0 then the returned table contains no data. To get the content of a returned table you must loop like this:</p>



<pre class="wp-block-preformatted">If TableData.RowCount &gt; 0 then
  TableData.MoveToFirstRow
End if
For iRow as integer = 1 to TableData.RowCount
  // get a field value
  Var FieldValue as string = TableData.StringValue("&lt;Fieldname in the table record&gt;")
  If iRow &lt; TableData.RowCount then
    TabeData.MoveToNextRow
  End if
next</pre>



<h4 class="wp-block-heading">Error Handling</h4>



<p>To catch an exception, you should code into your method something like this:</p>



<pre class="wp-block-preformatted"> Exception r As RFCErrorExceptionMBS
  MessageBox r.message </pre>



<h4 class="wp-block-heading">Interpretation of Returned Data</h4>



<p>If you want to get after the INVOKE the returned data you will have&nbsp;</p>



<ul class="wp-block-list"><li>a table or</li><li>a structure or</li><li>a field</li></ul>



<p>If you have a table you will get a certain field with:</p>



<pre class="wp-block-preformatted">Var TableContent as RFCTableMBS
TableContent = f.TableValue("&lt;Name of the returned table parameters&gt;")
If TableContent.RowCount &gt; 0 then
  TableContent.MoveToFirstRow
End if
For iRow as integer = 1 to TableContent.RowCount
  ListBox1.AddRow(TableContent.StringValue("FieldOne"), TableContent.StringValue("FieldTwo"))
  If iRow &lt; TableContent.RowCount then
    TableContent.MoveToNextRow
  End if
Next</pre>



<p>If you have a structure you will get a certain field with:</p>



<pre class="wp-block-preformatted">var s As RFCStructureMBS = f.StructureValue("ES_MESSAGE")</pre>



<pre class="wp-block-preformatted">TextField1.Value = s.StringValue("FieldOne")</pre>



<p>If you have a field you will get the data with:</p>



<pre class="wp-block-preformatted">TextField1.Value = f.StringValue("FieldName")</pre>



<p>Using the above techniques with the MBS plugin, your Xojo apps can now access information contained in SAP.</p>



<p><em>Michael Eckert studied economics from 1982-1986 and has been employed at T-Systems as a software architect since 1989. Michael has worked with ERP systems for 34 years, until 1998 with PL/1, since 1998 with ABAP in SAP R/3 and SAP S/4 HANA. He&#8217;s been developing with Xojo for about 9 years.</em></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>Xojo and JavaScript &#8211; A Perfect Combination</title>
		<link>https://blog.xojo.com/2020/02/03/xojo-and-javascript-a-perfect-combination/</link>
		
		<dc:creator><![CDATA[Stefanie Juchmes]]></dc:creator>
		<pubDate>Mon, 03 Feb 2020 10:00:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=6565</guid>

					<description><![CDATA[In the newest version of the MBS Xojo Plugin 10.0 we offer functions for the use of JavaScript in your Xojo solutions. If you have a problem that you want to solve, you don't have to reinvent the wheel again and again. ]]></description>
										<content:encoded><![CDATA[
<p>In the newest version of the MBS Xojo Plugin 10.0 we offer functions for the use of JavaScript in your Xojo solutions. If you have a problem that you want to solve, you don&#8217;t have to reinvent the wheel again and again. Perhaps someone has already found a solution to this problem and shared the solution on the Internet. So start a search engine and try your luck. Special thanks to <a href="https://www.andrerinas.de">André Rinas</a> whose site supplies very useful JavaScript snippets. This example is based on one of his JavaScript codes. Because you can use JavaScript code in your Xojo projects, you not need to convert an existing JavaScript function to Xojo syntax to use it directly in your projects.</p>



<p>In this example, I&#8217;ll show you a JavaScript that calculates the difference between two geo coordinates given by longitude and latitude. We will design a GUI with 4 Textfields. Two fields contains the longitude and latitude of the first coordinate, two other fields store the longitude and latitude of the second coordinate. Furthermore we need a label that shows the result of the calculation and a button to start it. Then we look at the JavaScript code.</p>



<p>For the calculation we need the longitude and latitude in the unit radiance. Because that we need a function that converts between angle and radiance since we have the coordinates in the unit angle. The formula for the calculation is y = x * Pi / 180.&nbsp;</p>



<p>A JavaScript function for that looks like this:</p>



<pre class="wp-block-preformatted">function DegToRad( deg ) {         
        return deg * Math.PI / 180; 
}</pre>



<p>The keyword “function” starts a function definition, followed by the function name. The parameters are written with brackets, just like in Xojo, but without data type. The calculation for the function body is surrounded by curly brackets. Math.Pi is a built-in constant that defines Pi, so we use it here to do the math.&nbsp;</p>



<p>Then we can write the function for the distance calculation:</p>



<pre class="wp-block-preformatted">function distance( lat1, lon1, lat2, lon2 ) {                </pre>



<pre class="wp-block-preformatted">       var R = 6371; // The earth's radius in km

       lat1 = DegToRad(lat1);
       lat2 = DegToRad(lat2);
       lon1 = DegToRad(lon1);
       lon2 = DegToRad(lon2);
 &nbsp;
       var x = (lon2 - lon1) * Math.cos((lat1+lat2) / 2);
       var y = (lat2 - lat1);
       var d = Math.sqrt(x*x + y*y) * R;
       return d;
 
}
 </pre>



<p>We have a function with four input parameters. That are the latitudes and longitudes of the coordinates. For each of these values we call the converting function and save the returned value in the variable again. Because these variables are defined as parameters of the function, we don’t need to declare them again. Moreover JavaScript has dynamic data types and internally uses doubles for all numbers. Because of this we don’t need to define them. All other variables (R, x, y and d) are explicitly declared with the keyword “var”. When using variables, we must pay attention to the fact that JavaScript is a case-sensitive language. A and a would be two different variables!</p>



<p>This JavaScript function is perfect for our use. Now we want to look at the possibilities to embedded it to our program.&nbsp; At first we want to evaluate the JavaScript. Because that we create a new instance of the JavaScriptEngineMBS class and evaluate the JavaScript with the “Evaluate function”. In the parameter of the function we set our JavaScript as a string. Additionally, we append the call of the function in JavaScript syntax.&nbsp;</p>



<pre class="wp-block-preformatted">	Dim js As New JavaScriptEngineMBS</pre>



<pre class="wp-block-preformatted">	Dim r as Variant = js.Evaluate("function DegToRad( deg )&nbsp; { return deg * Math.PI / 180 ; } function 	distance( lat1, lon1, lat2, lon2 ) { var R = 6371 ; lat1 = DegToRad(lat1); lat2 = DegToRad(lat2); lon1 = DegToRad(lon1); lon2 = DegToRad(lon2); var x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2); var y = (lat2 - lat1); var d = Math.sqrt(x * x + y * y) * R ; return d ; } distance( 50.73743, 7.0982068, 50.61, 7.2025);")</pre>



<p>Then we have the result of the variable. The result is of type variant with an embedded double value. If we want the result as a string, we call the “EvaluateToString” function in place of the “Evaluate” function with the same parameters and the plugin performs toString operation in JavaScript if needed.&nbsp;</p>



<p>It would be very annoying if we have to change the string of the JavaScript for each query by hand. Furthermore we want to calculate the difference between the coordinates that are set in the text fields and not between fix coordinates. One possibility to do this is to set global properties in JavaScript environment with the MBS Plugin functions.</p>



<p>Before we call one of the evaluation functions we set the variables like that:&nbsp;</p>



<pre class="wp-block-preformatted">js.GlobalProperty("lat1") = LatitudeA.Text
js.GlobalProperty("lat2") = LatitudeB.Text
js.GlobalProperty("lon1") = LongitudeA.Text
js.GlobalProperty("lon2") = LongitudeB.Text</pre>



<p>Then we replace the constant values in the function call, with our variables :&nbsp;</p>



<pre class="wp-block-preformatted">distance( lat1, lon1, lat2, lon2 )</pre>



<p>If we want to avoid setting this huge part of script in every evaluation function, we can add the DagToRad function and the distance function to the environment of the JavaScript. Then we only need to call the distance function with the right parameters. That is easier for debugging, too. Here the final example code:</p>



<pre class="wp-block-preformatted">Dim lat1 As String = LatitudeA.Text
Dim lat2 As String = LatitudeB.Text
Dim lon1 As String = LongitudeA.Text
Dim lon2 As String = LongitudeB.Text
Dim r As Variant&nbsp;
 
Dim js As New JavaScriptEngineMBS</pre>



<pre class="wp-block-preformatted">js.AddFunction "DegToRad", "function( deg ) { return deg * Math.PI / 180 ;}"  js.AddFunction "distance", "function( lat1, lon1, lat2, lon2 ) { lat1 = DegToRad(lat1); lat2 = DegToRad(lat2); lon1 = DegToRad(lon1); lon2 = DegToRad(lon2); var R = 6371; var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); var y = (lat2-lat1); var d = Math.sqrt(x*x + y*y) * R; return d; }"
 r = js.CallFunction("distance", lat1, lon1, lat2, lon2)
 Result.Text = str(r, “####.##") </pre>



<p>Once the JavaScriptEngineMBS object is initialized, you can store it in a window property and reuse it several times to do more calculations. A great use for this JavaScript is to do calculations in your applications to match the hash/signature algorithm used by a web service to authenticate. If you get a JavaScript snippet, you can just run it, if required dependencies are provided. And you may find it useful to perform JavaScript server side for your Xojo web apps.</p>



<p>I hope that you like our new JavaScript functions. I wish you lots of fun with them. If you have any questions, please do not hesitate to contact us.&nbsp;</p>



<p>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;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>I&#8217;m a developer, why should I blog?</title>
		<link>https://blog.xojo.com/2019/06/20/im-a-developer-why-should-i-blog/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Thu, 20 Jun 2019 16:24:31 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[XOJO.CONNECT]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5824</guid>

					<description><![CDATA[Having a blog is a great way to tell your customers what is going on, plus a very useful marketing tool.. ]]></description>
										<content:encoded><![CDATA[
<p>In our company meetings, we often expect to hear Alyssa (our blogmaster) solicit the engineers for blog posts. I get it, if you&#8217;re not used to writing, coming up with an idea and then writing that blog post can seem daunting. But good blog posts don&#8217;t have to be long, just useful. Keep it simple, get to the point. Having a blog is a great way to tell your customers what is going on, plus a very useful marketing tool. I&#8217;m going to be talking a little about this during my presentation at the <a href="https://www.monkeybreadsoftware.de/xojo/events/cologne-2019-event.shtml">MBS Xojo Conference in Cologne</a>, so I thought I&#8217;d offer some basic information about how blogging can be helpful to developers.</p>



<p>In marketing, we drive traffic, conversions and brand awareness with content. Blogs can be great for communicating about your product when it is in development, like if you have a huge project in the works that your customers are really excited about. They can also be venues for you to comment on happenings in your industry. Establish your product and yourself as a subject matter expert, your blog will then be a great vehicle to build trust with prospects through your content.</p>



<p>Don&#8217;t start a blog if you&#8217;re not committed. You are going to need to maintain it regularly, but it&#8217;s up to you to commit to the schedule that is reasonable for you to maintain. Start small, one to two posts a month. Set a schedule for yourself so you have plenty of time to take a break from coding and focus on writing a valuable piece of marketing content. Go a step further (and make it easy on yourself) by writing up several blog posts before you launch so you can draw from your bank when it&#8217;s time to post.</p>



<p>For your first post, start simple and write a launch post to boast about the features of your product/service, showcase screenshots, videos, and a link to download or purchase. This post will be a great piece of content that you can repurpose. Because when you have all of this great content &#8211; why only put it in one place? Use it in your other marketing channels, like on social media, email blasts, presentations (remember, I said before that I was going to talk about this in my presentation!), etc.  Also, once you have created your content you can also post it on third-party sites, like Medium, LinkedIn, or you could even turn it into a slideshow if that makes sense. From those other places, you can link directly to your landing page, bringing it full circle. Your content about your app made it out to the world and brought some prospects in &#8211; sweet!</p>



<p>When blogging, take things into consideration that can help your SEO, like your target keywords, making sure the content you create is quality and try to put it into places where you can gain some quality backlinks.</p>



<p>One great thing to remember about blogging (and on your landing page or website in general) is that you always want to offer a call to action. For a blog post about your newest release with a video, end your post by saying, &#8220;Check out our new video now!&#8221; Or if you just announced your company conference, make sure to offer &#8211; &#8220;Learn more about the <a href="https://www.xojo.com/xdc/">2020 conference</a>!&#8221; (shameless XOJO.CONNECT plug &#8211; you really should be there). You always want to offer more content to keep people on your site. </p>



<p>Did you know that B2C companies that blog generate 88% more leads per month than those who do not? Given that fact &#8211; why not try it out and see how it works for you? Prospects need to see your messages 7 times in order for them to resonate or take action, so don&#8217;t let your beautiful content go to waste &#8211; repurpose, share and enjoy a bump in your traffic and hopefully, downloads!</p>



<p></p>



<p></p>



<p></p>



<p></p>



<p></p>



<p></p>



<p></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>See You At The Next MBS Xojo Conference</title>
		<link>https://blog.xojo.com/2016/11/01/guest-post-see-you-at-the-next-mbs-xojo-conference/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Tue, 01 Nov 2016 21:51:51 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Add-Ons]]></category>
		<category><![CDATA[Monkeybread Software]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2024</guid>

					<description><![CDATA[Xojo developers from all over the world will meet the first week in May 2017 in metropolitan Berlin, Germany.]]></description>
										<content:encoded><![CDATA[<p><em>Guest Post by Christian Schmitz of <a href="http://www.monkeybreadsoftware.de/xojo/">Monkeybread Software</a>, a Xojo developer from Germany. 18 years ago various consulting projects brought Christian to plugin development for Xojo. Digging through various libraries, OS features and compiler techniques, he built a huge plugin toolbox for use in his own projects and to license to others. Christian has (co)hosted ten conferences over the years and you can join the next one in Berlin.</em></p>
<p>Do you like to meet other Xojo users and go to conferences? Well, you are in luck! In 2017 there is a conference being organized by Monkeybread Software. Xojo developers from all over the world will meet the first week in May 2017 in metropolitan Berlin, Germany. In the center of western Berlin at the Ellington hotel, next to the nearby Kurfürstendamm, the Zoo and KaDeWe. We selected this central location in Europe for easy traveling for developers from east and west.</p>
<p><span id="more-2024"></span></p>
<p>Beside the two conference days, we have an accompanying social programme with dinner events and an optional two training days. For the evenings we have casual get-togethers in the hotel bar and beer garden.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2027" src="https://blog.xojo.com/wp-content/uploads/2016/11/Screen-Shot-2016-11-01-at-2.47.00-PM.png" alt="screen-shot-2016-11-01-at-2-47-00-pm" width="1103" height="732" /></p>
<p>We are happy to welcome Xojo&#8217;s Founder &amp; CEO Geoff Perlman, Xojo engineer Travis Hill as well Xojo&#8217;s Stéphane Pinel from France will be present to talk about Xojo. Jens Boschulte, our PDF specialist and creator of the DynaPDF library will be available for questions.</p>
<p>All Xojo conferences are a great places to learn about Xojo, see what is new for Xojo IDE itself as well as for third-party products. You can meet other developers and get a lot of new contacts.  Ask questions and discuss how you solve problems, learn from others and discover new techniques. Feel free to present yourself and your projects, so others can give you tips and learn from you. As you depend on Xojo for your business, please use this to talk to the Xojo people about what you need from them in the future.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2028" src="https://blog.xojo.com/wp-content/uploads/2016/11/Screen-Shot-2016-11-01-at-2.47.07-PM.png" alt="screen-shot-2016-11-01-at-2-47-07-pm" width="978" height="736" /></p>
<p>The schedule:</p>
<p>May 3rd: Xojo Training in English</p>
<p>May 4th: Conference, first day with dinner event</p>
<p>May 5th: Conference, second day</p>
<p>May 6th: Xojo Training in German</p>
<p>In the evenings we meet for dinner so you can meet other attendees. Registration is available and we already have people coming from six countries.</p>
<p>The early bird offer available till 4th December is just 299 Euro plus VAT. Attending the conference costs regularly 499 Euro plus VAT, including food and beverage in the Ellington Hotel as well as an accompanying social program.</p>
<p>Sessions are to be held in English. Our conference is conceived as a networking event for the Xojo community. The conference is an ideal opportunity for sharing your thoughts and your own development experience with fellow users and developers. If you like to give a presentation, please contact us as soon as possible. Speakers receive discounted tickets.</p>
<p><a href="http://www.monkeybreadsoftware.de/xojo/events/berlin-2017-event.shtml">Registration and more Information</a>.</p>
<p><a href="http://www.monkeybreadsoftware.de/xojo/events/berlin-2017-training.shtml">Training days in German and English.</a></p>
<p>For any questions, please <a href="http://www.monkeybreadsoftware.de/contact.shtml">contact Monkeybread Software</a> directly.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
