<!DOCTYPE html>
<!--[if IE 6]>
<html id="ie6" lang="en">
<![endif]-->
<!--[if IE 7]>
<html id="ie7" lang="en">
<![endif]-->
<!--[if IE 8]>
<html id="ie8" lang="en">
<![endif]-->
<!--[if !(IE 6) & !(IE 7) & !(IE 8)]><!-->
<html lang="en">
<!--<![endif]-->
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>
Product7 | Real Value Delivered Weekly, Guaranteed	</title>
<link rel="profile" href="https://gmpg.org/xfn/11" />
<link rel="stylesheet" type="text/css" media="all" href="https://s2.wp.com/wp-content/themes/pub/twentyeleven/style.css?m=1741693348i&amp;ver=20190507" />
<link rel="pingback" href="https://blog.product7.com/xmlrpc.php">
<!--[if lt IE 9]>
<script src="https://s2.wp.com/wp-content/themes/pub/twentyeleven/js/html5.js?m=1394055389i&amp;ver=3.7.0" type="text/javascript"></script>
<![endif]-->
<meta name='robots' content='max-image-preview:large' />

<!-- Async WordPress.com Remote Login -->
<script id="wpcom_remote_login_js">
var wpcom_remote_login_extra_auth = '';
function wpcom_remote_login_remove_dom_node_id( element_id ) {
	var dom_node = document.getElementById( element_id );
	if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); }
}
function wpcom_remote_login_remove_dom_node_classes( class_name ) {
	var dom_nodes = document.querySelectorAll( '.' + class_name );
	for ( var i = 0; i < dom_nodes.length; i++ ) {
		dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] );
	}
}
function wpcom_remote_login_final_cleanup() {
	wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" );
	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" );
	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" );
	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" );
	wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" );
	wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" );
}

// Watch for messages back from the remote login
window.addEventListener( "message", function( e ) {
	if ( e.origin === "https://r-login.wordpress.com" ) {
		var data = {};
		try {
			data = JSON.parse( e.data );
		} catch( e ) {
			wpcom_remote_login_final_cleanup();
			return;
		}

		if ( data.msg === 'LOGIN' ) {
			// Clean up the login check iframe
			wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" );

			var id_regex = new RegExp( /^[0-9]+$/ );
			var token_regex = new RegExp( /^.*|.*|.*$/ );
			if (
				token_regex.test( data.token )
				&& id_regex.test( data.wpcomid )
			) {
				// We have everything we need to ask for a login
				var script = document.createElement( "script" );
				script.setAttribute( "id", "wpcom_remote_login_validate" );
				script.src = '/remote-login.php?wpcom_remote_login=validate'
					+ '&wpcomid=' + data.wpcomid
					+ '&token=' + encodeURIComponent( data.token )
					+ '&host=' + window.location.protocol
					+ '//' + window.location.hostname
					+ '&postid=649'
					+ '&is_singular=';
				document.body.appendChild( script );
			}

			return;
		}

		// Safari ITP, not logged in, so redirect
		if ( data.msg === 'LOGIN-REDIRECT' ) {
			window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href;
			return;
		}

		// Safari ITP, storage access failed, remove the request
		if ( data.msg === 'LOGIN-REMOVE' ) {
			var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }';
			var style_zap = document.createElement( 'style' );
			style_zap.type = 'text/css';
			style_zap.appendChild( document.createTextNode( css_zap ) );
			document.body.appendChild( style_zap );

			var e = document.getElementById( 'wpcom_request_access_iframe' );
			e.parentNode.removeChild( e );

			document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000';

			return;
		}

		// Safari ITP
		if ( data.msg === 'REQUEST_ACCESS' ) {
			console.log( 'request access: safari' );

			// Check ITP iframe enable/disable knob
			if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) {
				return;
			}

			// If we are in a "private window" there is no ITP.
			var private_window = false;
			try {
				var opendb = window.openDatabase( null, null, null, null );
			} catch( e ) {
				private_window = true;
			}

			if ( private_window ) {
				console.log( 'private window' );
				return;
			}

			var iframe = document.createElement( 'iframe' );
			iframe.id = 'wpcom_request_access_iframe';
			iframe.setAttribute( 'scrolling', 'no' );
			iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' );
			iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid );

			var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } ';

			var style = document.createElement( 'style' );
			style.type = 'text/css';
			style.id = 'wpcom_request_access_styles';
			style.appendChild( document.createTextNode( css ) );
			document.body.appendChild( style );

			document.body.appendChild( iframe );
		}

		if ( data.msg === 'DONE' ) {
			wpcom_remote_login_final_cleanup();
		}
	}
}, false );

// Inject the remote login iframe after the page has had a chance to load
// more critical resources
window.addEventListener( "DOMContentLoaded", function( e ) {
	var iframe = document.createElement( "iframe" );
	iframe.style.display = "none";
	iframe.setAttribute( "scrolling", "no" );
	iframe.setAttribute( "id", "wpcom_remote_login_key" );
	iframe.src = "https://r-login.wordpress.com/remote-login.php"
		+ "?wpcom_remote_login=key"
		+ "&origin=aHR0cHM6Ly9ibG9nLnByb2R1Y3Q3LmNvbQ%3D%3D"
		+ "&wpcomid=21774431"
		+ "&time=" + Math.floor( Date.now() / 1000 );
	document.body.appendChild( iframe );
}, false );
</script>
<link rel='dns-prefetch' href='//s2.wp.com' />
<link rel='dns-prefetch' href='//s0.wp.com' />
<link rel="alternate" type="application/rss+xml" title="Product7 &raquo; Feed" href="https://blog.product7.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Product7 &raquo; Comments Feed" href="https://blog.product7.com/comments/feed/" />
	<script type="text/javascript">
		/* <![CDATA[ */
		function addLoadEvent(func) {
			var oldonload = window.onload;
			if (typeof window.onload != 'function') {
				window.onload = func;
			} else {
				window.onload = function () {
					oldonload();
					func();
				}
			}
		}
		/* ]]> */
	</script>
	<link crossorigin='anonymous' rel='stylesheet' id='all-css-0-1' href='/wp-content/mu-plugins/jetpack-plugin/moon/modules/infinite-scroll/infinity.css?m=1770909026i&cssminify=yes' type='text/css' media='all' />
<style id="wp-emoji-styles-inline-css">

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}

/*# sourceURL=/wp-content/plugins/gutenberg-core/v22.9.0/build/styles/block-library/common.min.css */
</style>
<style id="wp-block-paragraph-inline-css">
.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
/*# sourceURL=https://s0.wp.com/wp-content/plugins/gutenberg-core/v22.9.0/build/styles/block-library/paragraph/style.min.css */
</style>
<style id="wp-block-library-inline-css-extra">
.has-text-align-justify {
	text-align:justify;
}
.has-text-align-justify{text-align:justify;}
/*# sourceURL=wp-block-library-inline-css */
</style>

<style id="classic-theme-styles-inline-css">
.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-accordion-heading{margin:0}.wp-block-accordion-heading__toggle{background-color:inherit!important;color:inherit!important}.wp-block-accordion-heading__toggle:not(:focus-visible){outline:none}.wp-block-accordion-heading__toggle:focus,.wp-block-accordion-heading__toggle:hover{background-color:inherit!important;border:none;box-shadow:none;color:inherit;padding:var(--wp--preset--spacing--20,1em) 0;text-decoration:none}.wp-block-accordion-heading__toggle:focus-visible{outline:auto;outline-offset:0}
/*# sourceURL=/wp-content/plugins/gutenberg-core/v22.9.0/build/styles/block-library/classic.min.css */
</style>

<link crossorigin='anonymous' rel='stylesheet' id='all-css-8-1' href='/_static/??-eJx9jEEOAiEQBD/kQECjeDC+ZWEnijIwYWA3/l72op689KFTVXplCCU3zE1z6reYRYfiUwlP0VYZpwxIJE4IFRd10HOU9iFA2iuhCiI7/ROiDt9WxfETT20jCOc4YUIa2D9t5eGA91xRBMZS7ATtPkTZvCtdzNEZt7f2fHq8Afl7R7w=&cssminify=yes' type='text/css' media='all' />
<style id="global-styles-inline-css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--blue: #1982d1;--wp--preset--color--dark-gray: #373737;--wp--preset--color--medium-gray: #666;--wp--preset--color--light-gray: #e2e2e2;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-blue-color{color: var(--wp--preset--color--blue) !important;}.has-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-color{color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-blue-background-color{background-color: var(--wp--preset--color--blue) !important;}.has-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-background-color{background-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-blue-border-color{border-color: var(--wp--preset--color--blue) !important;}.has-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-border-color{border-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;}
/*# sourceURL=global-styles-inline-css */
</style>

<link crossorigin='anonymous' rel='stylesheet' id='all-css-10-1' href='/_static/??-eJyNj+EKwjAMhF/IGqaT+Ud8lq1mtS5Nypo69vZ2oDARhn9CvnB35GCKxgorsoLeMWCCmDvQqRxmJHwiQ0dih7S3Ke3gD3nSmdBM0Ur48YRsImXnOcGIJdeV1UFRrXDL5FBM+aZVL/wFpqfWj1vWB2ps7fBmCCLLuGUqHTz3nr2iSXYUok+1da0l+houVXM6Hs51U9WPF4Hndxw=&cssminify=yes' type='text/css' media='all' />
<style id="jetpack-global-styles-frontend-style-inline-css">
:root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;}
/*# sourceURL=jetpack-global-styles-frontend-style-inline-css */
</style>
<link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='/wp-content/themes/h4/global.css?m=1420737423i&cssminify=yes' type='text/css' media='all' />
<script id="wpcom-actionbar-placeholder-js-extra">
var actionbardata = {"siteID":"21774431","postID":"0","siteURL":"https://blog.product7.com","xhrURL":"https://blog.product7.com/wp-admin/admin-ajax.php","nonce":"ddedc0e33a","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https://s0.wp.com/wp-content/js/wpcom-proxy-request.js?m=1513050504i&amp;ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your \u003Ca href=\"https://wordpress.com/reader\"\u003EReader\u003C/a\u003E","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Shortlink copied to clipboard."}};
//# sourceURL=wpcom-actionbar-placeholder-js-extra
</script>
<script id="jetpack-mu-wpcom-settings-js-before">
var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https://s1.wp.com/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/moon/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/"};
//# sourceURL=jetpack-mu-wpcom-settings-js-before
</script>
<script crossorigin='anonymous' type='text/javascript'  src='/wp-content/js/rlt-proxy.js?m=1720530689i'></script>
<script id="rlt-proxy-js-after">
	rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} );
//# sourceURL=rlt-proxy-js-after
</script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://product7llc.wordpress.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress.com" />
<link rel='shortlink' href='https://wp.me/1tmwv' />

<!-- Jetpack Open Graph Tags -->
<meta property="og:type" content="website" />
<meta property="og:title" content="Product7" />
<meta property="og:description" content="Real Value Delivered Weekly, Guaranteed" />
<meta property="og:url" content="https://blog.product7.com/" />
<meta property="og:site_name" content="Product7" />
<meta property="og:image" content="https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=200&#038;ts=1776964485" />
<meta property="og:image:width" content="200" />
<meta property="og:image:height" content="200" />
<meta property="og:image:alt" content="" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:creator" content="@product7" />

<!-- End Jetpack Open Graph Tags -->
<link rel="shortcut icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=32" sizes="16x16" />
<link rel="icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=32" sizes="16x16" />
<link rel="apple-touch-icon" href="https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=114" />
<link rel='openid.server' href='https://blog.product7.com/?openidserver=1' />
<link rel='openid.delegate' href='https://blog.product7.com/' />
<link rel="search" type="application/opensearchdescription+xml" href="https://blog.product7.com/osd.xml" title="Product7" />
<link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" />
<meta name="description" content="Real Value Delivered Weekly, Guaranteed" />
<link crossorigin='anonymous' rel='stylesheet' id='all-css-0-5' href='/_static/??-eJydjtsKwjAQRH/IdgmIxQfxUyTdLGXbTTZkE4p/r+IFfBH18QzDmYE1d6ipUqoQW5elTZwMZqrZ4/JgiKoJTpwQRlFcDGzlTKVHsw18b4gampAB+qLNSF6lZ/Cr8H6psQSwNhoWzpX1Wn6jPnL692plodBNXoTK+RPdBo7x4IbB7dyw37r5AmPYg2Q=&cssminify=yes' type='text/css' media='all' />

</head>

<body class="home blog wp-embed-responsive wp-theme-pubtwentyeleven customizer-styles-applied single-author two-column right-sidebar jetpack-reblog-enabled">
<div class="skip-link"><a class="assistive-text" href="#content">Skip to primary content</a></div><div class="skip-link"><a class="assistive-text" href="#secondary">Skip to secondary content</a></div><div id="page" class="hfeed">
	<header id="branding">
			<hgroup>
				<h1 id="site-title"><span><a href="https://blog.product7.com/" rel="home">Product7</a></span></h1>
				<h2 id="site-description">Real Value Delivered Weekly, Guaranteed</h2>
			</hgroup>

						<a href="https://blog.product7.com/">
									<img src="https://blog.product7.com/wp-content/uploads/2011/08/6087657961_5c2fa54702_b.jpg" width="1000" height="288" alt="Product7" />
								</a>
			
									<form method="get" id="searchform" action="https://blog.product7.com/">
		<label for="s" class="assistive-text">Search</label>
		<input type="text" class="field" name="s" id="s" placeholder="Search" />
		<input type="submit" class="submit" name="submit" id="searchsubmit" value="Search" />
	</form>
			
			<nav id="access">
				<h3 class="assistive-text">Main menu</h3>
				<div class="menu"><ul>
<li class="current_page_item"><a href="https://blog.product7.com/">Home</a></li><li class="page_item page-item-2"><a href="https://blog.product7.com/about/">About</a></li>
<li class="page_item page-item-17"><a href="https://blog.product7.com/contact-us/">Contact Us</a></li>
</ul></div>
			</nav><!-- #access -->
	</header><!-- #branding -->


	<div id="main">

		<div id="primary">
			<div id="content" role="main">

			
							<nav id="nav-above">
				<h3 class="assistive-text">Post navigation</h3>
				<div class="nav-previous"><a href="https://blog.product7.com/page/2/" ><span class="meta-nav">&larr;</span> Older posts</a></div>
				<div class="nav-next"></div>
			</nav><!-- #nav-above -->
			
				
					
	<article id="post-649" class="post-649 post type-post status-publish format-standard hentry category-uncategorized tag-game-dev">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2021/10/15/overview-of-game-engines-in-2021/" rel="bookmark">Overview of Game Engines in&nbsp;2021</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2021/10/15/overview-of-game-engines-in-2021/" title="2:14 PM" rel="bookmark"><time class="entry-date" datetime="2021-10-15T14:14:43-05:00">October 15, 2021</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2021/10/15/overview-of-game-engines-in-2021/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			
<p class="wp-block-paragraph">Nice overview of current game engines from <a href="https://www.freecodecamp.org/news/how-to-make-a-video-game-create-your-own-game-from-scratch-tutorial/">freecodecamp</a>.</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/game-dev/" rel="tag">Game Dev</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2021/10/15/overview-of-game-engines-in-2021/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-649 -->

				
					
	<article id="post-539" class="post-539 post type-post status-publish format-standard hentry category-uncategorized">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2021/04/16/unity3d-game-development-course/" rel="bookmark">Unity3D Game Development&nbsp;Course</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2021/04/16/unity3d-game-development-course/" title="11:28 AM" rel="bookmark"><time class="entry-date" datetime="2021-04-16T11:28:54-05:00">April 16, 2021</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2021/04/16/unity3d-game-development-course/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			
<p class="wp-block-paragraph">Building video games can be just as much fun as playing them. And this in-depth Unity 3D course for beginners will show you how to get started as a game developer. You&#8217;ll learn how to install Unity, program game physics, animate your characters, code your enemy AI, and more. (7 hour YouTube course): <a rel="noreferrer noopener" href="https://www.freecodecamp.org/news/game-development-for-beginners-unity-course/" target="_blank">https://www.freecodecamp.org/news/game-development-for-beginners-unity-course/</a></p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2021/04/16/unity3d-game-development-course/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-539 -->

				
					
	<article id="post-420" class="post-420 post type-post status-publish format-standard hentry category-development category-server-development tag-amazon-aws">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/" rel="bookmark">Using Amazon SQS directly from Amazon API&nbsp;Gateway</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/" title="12:06 PM" rel="bookmark"><time class="entry-date" datetime="2019-06-21T12:06:14-05:00">June 21, 2019</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p><img data-attachment-id="421" data-permalink="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/big_queue_3/" data-orig-file="https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg" data-orig-size="467,238" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="big_queue_3" data-image-description="" data-image-caption="" data-large-file="https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg?w=467" class="alignnone size-full wp-image-421" src="https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg" alt="big_queue_3" width="467" height="238" srcset="https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg 467w, https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg?w=150&amp;h=76 150w, https://blog.product7.com/wp-content/uploads/2019/06/big_queue_3.jpg?w=300&amp;h=153 300w" sizes="(max-width: 467px) 100vw, 467px" /></p>
<p>A project I&#8217;m working on right now uses <a href="https://aws.amazon.com/sqs/">Amazon&#8217;s SQS service</a> to handle interprocess communication between elements of a large and complex back end architecture.  SQS is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications. Using SQS, you can send, store, and receive messages between software components at any volume, without losing messages or requiring other services to be available.</p>
<p>One of our uses cases requires a SQS message to be triggered and created by an external call to our API. The most common way of handling this is to use a Lambda function to respond to an API request and then the Lambda function will create the appropriate SQS message and add it to the queue. What if we could skip Lambda all together? <a href="https://aws.amazon.com/api-gateway/">Amazon API Gateway</a> can now be used to directly created SQS messages.</p>
<p>High level steps I followed</p>
<ol class="ak-ol">
<li>Created an Amazon SQS queue.</li>
<li>Created an Amazon IAM policy and role (to access the SQS queue).</li>
<li>Published an API on API Gateway.</li>
<li>Send and receive messages (single and batch) through the API Gateway.</li>
</ol>
<p>&lt;&gt;</p>
<p>Details on #3 (Published an API on API Gateway)</p>
<ul class="ak-ul">
<li>created a new api at <a class="sc-kwXFOU kPXGcr" title="https://us-west-2.console.aws.amazon.com/apigateway/" href="https://us-west-2.console.aws.amazon.com/apigateway/">https://us-west-2.console.aws.amazon.com/apigateway/</a></li>
<li>created resources /v1/send/</li>
<li>created GET method /v1/send/GET</li>
<li>added URL query string &#8216;MessageBody&#8217; to method execution for GET</li>
<li>added Integration request that points to appropriate SQS ARN
<ul>
<li>Integration type: AWS Service<br />
AWS Region: us-west-2<br />
AWS Service: Simple Queue Service (SQS)<br />
AWS Subdomain: NULL<br />
HTTP method: GET<br />
Path override: 453862545997/ninegeartest (SQS ARN)<br />
Execution role: arn:aws:iam::453862545997:role/apigateway-sqs-ninthgear-access-role<br />
Credentials cache: Do not add caller credentials to cache key<br />
Content Handling: Passthrough<br />
Use Default Timeout</p>
<p>URL Query String Parameters:</p>
<p>Action &#8216;SendMessage&#8217;<br />
MessageBody method.request.querystring.MessageBody</p>
<p>MessageBody=TestMessageHello</li>
</ul>
</li>
<li>&nbsp;
<div class="sc-fXNpEn bEJUQx">
<div class="sc-dtmvvg ehScao">
<div class="sc-cCXWQg jxTltj">
<div class="sc-fcLdzD ldcuYI">
<div class="sc-gyFTku jwuGki">
<div role="presentation">
<div class="sc-bYzVrU jLDNqO">
<div class="ak-renderer-document">
<p><span style="color:var(--color-text);">Used API Gateway Test function to call /v1/send/GET with MessageBody and then confirmed it appeared correctly in the previously created queue</span></p>
<p>Response is</p>
<p>{<br />
&#8220;SendMessageResponse&#8221;: {<br />
&#8220;ResponseMetadata&#8221;: {<br />
&#8220;RequestId&#8221;: &#8220;dfc617e1-b3c9-56a8-b9bf-426457676e2d&#8221;<br />
},<br />
&#8220;SendMessageResult&#8221;: {<br />
&#8220;MD5OfMessageAttributes&#8221;: null,<br />
&#8220;MD5OfMessageBody&#8221;: &#8220;0ef0d7773a388095bee26966144cc131&#8221;,<br />
&#8220;MessageId&#8221;: &#8220;3eb7ed29-c259-4b15-8bd3-bedeac865ee5&#8221;,<br />
&#8220;SequenceNumber&#8221;: null<br />
}<br />
}<br />
}</p>
<p>Logs</p>
<p>Execution log for request 01e665e2-9394-11e9-80e3-7b3c608a2b3c<br />
Thu Jun 20 19:45:50 UTC 2019 : Starting execution for request: 01e665e2-9394-11e9-80e3-7b3c608a2b3c<br />
Thu Jun 20 19:45:50 UTC 2019 : HTTP Method: GET, Resource Path: /v1/send<br />
Thu Jun 20 19:45:50 UTC 2019 : Method request path: {}<br />
Thu Jun 20 19:45:50 UTC 2019 : Method request query string: {MessageBody=TestMessageHello}<br />
Thu Jun 20 19:45:50 UTC 2019 : Method request headers: {}<br />
Thu Jun 20 19:45:50 UTC 2019 : Method request body before transformations:<br />
Thu Jun 20 19:45:50 UTC 2019 : Endpoint request URI: <a class="sc-kwXFOU kPXGcr" title="https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello" href="https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello">https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello</a><br />
Thu Jun 20 19:45:50 UTC 2019 : Endpoint request headers: {Authorization=*************************************************************************************************************************************************************************************************************************************************01fa36, X-Amz-Date=20190620T194550Z, x-amzn-apigateway-api-id=mf9zjl6bxj, Accept=application/json, User-Agent=AmazonAPIGateway_mf9zjl6bxj, X-Amz-Security-Token=AgoGb3JpZ2luEK///////////wEaCXVzLXdlc3QtMiKAAkhESmjWUuH4MmwXcX3mJZu1ZFF29by1qO8Y/mUjx1llmQ6VlpkceQ2wnYfz8Gr4loy/CxqjjQeKa4Zpz83c1c5aEV7LrX4XlBIFxH5c+0O/BHA4Y6JbcSCSzc2z/Y6AUpvBnrfdE+S7TAqQw0aXzDTVfoFiysOFhatFmGfDa3TmXbNje6yqsj2QJKcTpI2D8KlN1IqUcuIMyYW06j8iZlcDcDuaB9BNtw3cNimdZpvUknaOr6HZ9kaSmhhIGnyRYxTN7bEnsqEGQY00p1Xsr8Q8JTrAaiHYSZA+964bBPWbladcrBPPvYGw111yV8teyabwJ6BczFmPHONyKNBSEbwqigMIlf//////////ARAAGgw0NTM4NjI1NDU5OTciDJAFb/8TLGKSTv3VkireAptIn3MrBh0o+01/ckMLSEM8kpHeFlnXhWeqfbQ11PIEH36/I7ahYyZE0Z7eS8fGbZ4DQmXDjB5D2Z6Y8Wo8b1gfnxZ7MwGdYhDlo/x4KeE7R92XbhPX+tAEsL61TMx6Pls7c9 [TRUNCATED]<br />
Thu Jun 20 19:45:50 UTC 2019 : Endpoint request body after transformations:<br />
Thu Jun 20 19:45:50 UTC 2019 : Sending request to <a class="sc-kwXFOU kPXGcr" title="https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello" href="https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello">https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&amp;MessageBody=TestMessageHello</a><br />
Thu Jun 20 19:45:50 UTC 2019 : Received response. Status: 200, Integration latency: 18 ms<br />
Thu Jun 20 19:45:50 UTC 2019 : Endpoint response headers: {x-amzn-RequestId=dfc617e1-b3c9-56a8-b9bf-426457676e2d, Date=Thu, 20 Jun 2019 19:45:50 GMT, Content-Type=application/json, Content-Length=276}<br />
Thu Jun 20 19:45:50 UTC 2019 : Endpoint response body before transformations: {&#8220;SendMessageResponse&#8221;:{&#8220;ResponseMetadata&#8221;:{&#8220;RequestId&#8221;:&#8221;dfc617e1-b3c9-56a8-b9bf-426457676e2d&#8221;},&#8221;SendMessageResult&#8221;:{&#8220;MD5OfMessageAttributes&#8221;:null,&#8221;MD5OfMessageBody&#8221;:&#8221;0ef0d7773a388095bee26966144cc131&#8243;,&#8221;MessageId&#8221;:&#8221;3eb7ed29-c259-4b15-8bd3-bedeac865ee5&#8243;,&#8221;SequenceNumber&#8221;:null}}}<br />
Thu Jun 20 19:45:50 UTC 2019 : Method response body after transformations: {&#8220;SendMessageResponse&#8221;:{&#8220;ResponseMetadata&#8221;:{&#8220;RequestId&#8221;:&#8221;dfc617e1-b3c9-56a8-b9bf-426457676e2d&#8221;},&#8221;SendMessageResult&#8221;:{&#8220;MD5OfMessageAttributes&#8221;:null,&#8221;MD5OfMessageBody&#8221;:&#8221;0ef0d7773a388095bee26966144cc131&#8243;,&#8221;MessageId&#8221;:&#8221;3eb7ed29-c259-4b15-8bd3-bedeac865ee5&#8243;,&#8221;SequenceNumber&#8221;:null}}}<br />
Thu Jun 20 19:45:50 UTC 2019 : Method response headers: {X-Amzn-Trace-Id=Root=1-5d0be26e-b7b766dba15eb99009933350, Content-Type=application/json}<br />
Thu Jun 20 19:45:50 UTC 2019 : Successfully completed execution<br />
Thu Jun 20 19:45:50 UTC 2019 : Method completed with status: 200</p>
<p>&lt;&gt;</p>
<p>More details and an example I followed at <a class="sc-kwXFOU kPXGcr" title="https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs" href="https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs">https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs</a></p>
<p>&nbsp;</p>
<div class="media-single image-center sc-hHjfor gBotsP sc-khKDHO cDVXNn">
<div class="sc-fLGdtL gEerwC">
<div class="sc-kpIUip cMqBCb">
<div class="sc-dLaOHn jAjqDK sc-JqSnb ffaKhJ">
<div class="wrapper"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sc-dtmvvg ehScao">
<div class="sc-cCXWQg jxTltj">
<div>
<div class="sc-iTlrqL ehNrdF">
<div class="sc-lmgjyN bDISBJ">
<div class="f18lu6hy">
<div>
<div class="f9b7sff miniMode fcq6r4t"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sc-koDbue diMvWe">
<div class="sc-gwUXUd fjsMUv">
<div class="sc-dwLhYX dZHrtt">
<div></div>
</div>
</div>
</div>
</li>
</ul>
<p>&nbsp;</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/development/" rel="category tag">development</a>, <a href="https://blog.product7.com/category/server-development/" rel="category tag">Server Development</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/amazon-aws/" rel="tag">amazon aws</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-420 -->

				
					
	<article id="post-410" class="post-410 post type-post status-publish format-standard hentry category-development category-game category-uncategorized tag-engine tag-game-dev">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/" rel="bookmark">Open source alternative to Unity and&nbsp;Unreal</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/" title="5:15 PM" rel="bookmark"><time class="entry-date" datetime="2019-01-17T17:15:21-06:00">January 17, 2019</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p><img data-attachment-id="411" data-permalink="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/unity-game-maker/" data-orig-file="https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg" data-orig-size="1000,563" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="unity-game-maker" data-image-description="" data-image-caption="" data-large-file="https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg?w=584" class="alignnone size-full wp-image-411" src="https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg" alt="unity-game-maker" width="1000" height="563" srcset="https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg 1000w, https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg?w=150&amp;h=84 150w, https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg?w=300&amp;h=169 300w, https://blog.product7.com/wp-content/uploads/2019/01/unity-game-maker.jpg?w=768&amp;h=432 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p>There has been controversy around <a href="https://unity3d.com/">Unity&#8217;s</a> changes to their eula and how it affects independent developers. <a href="https://improbable.io/">Improbable</a> &#8211; a vc backed developer of a massive online multiplayer game back end solution  &#8211; <a href="https://improbable.io/company/news/2019/01/11/improbable-a-final-statement-on-spatialos-and-unity">lost their Unity license for a short time</a>, which in turn affected hundreds, maybe thousands, of independent game developers, or at least caused a lot of anguish and confusion.</p>
<p>With a closed source game engine you always face the chance of the rules being changed on you after you have invested years of development.</p>
<p>Is there a legitimate open source alternative to <a href="https://unity3d.com/">Unity</a> or <a href="https://www.unrealengine.com/">Unreal</a>? Here are some candidates &#8211; I&#8217;ll be experimenting/evaluating several over the next month or so and will post feedback.</p>
<p><a href="https://godotengine.org/">GodotEngine</a></p>
<p>Godot provides a huge set of common tools, so you can just focus on making your game without reinventing the wheel.</p>
<p>Godot is completely free and open-source under the very permissive MIT license. No strings attached, no royalties, nothing. Your game is yours, down to the last line of engine code.</p>
<p><a href="https://urho3d.github.io/">Urho3D</a></p>
<p>A free lightweight, cross-platform 2D and 3D game engine implemented in C++ and released under the MIT license. Greatly inspired by <a href="http://www.ogre3d.org/">OGRE</a> and <a href="http://www.horde3d.org/">Horde3D</a>.</p>
<p><a href="http://www.garagegames.com/products/torque-3d">Torque 3d</a></p>
<p>3D is a easy-to-use game creation platform. Architected from the ground up for maximum flexibility and performance across a wide range of hardware and built upon&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/development/" rel="category tag">development</a>, <a href="https://blog.product7.com/category/development/game/" rel="category tag">game</a>, <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/engine/" rel="tag">engine</a>, <a href="https://blog.product7.com/tag/game-dev/" rel="tag">Game Dev</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-410 -->

				
					
	<article id="post-396" class="post-396 post type-post status-publish format-standard hentry category-development category-mobile-development category-react-native category-uncategorized">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/" rel="bookmark">React Native for Mobile &#8211; Initial&nbsp;Impressions</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/" title="11:01 AM" rel="bookmark"><time class="entry-date" datetime="2018-09-13T11:01:07-05:00">September 13, 2018</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/#comments">1</a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p><img data-attachment-id="398" data-permalink="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/nativesmall/" data-orig-file="https://blog.product7.com/wp-content/uploads/2018/09/nativesmall.png" data-orig-size="200,200" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="nativesmall" data-image-description="" data-image-caption="" data-large-file="https://blog.product7.com/wp-content/uploads/2018/09/nativesmall.png?w=200" class="alignnone size-full wp-image-398" src="https://blog.product7.com/wp-content/uploads/2018/09/nativesmall.png" alt="nativesmall" width="200" height="200" srcset="https://blog.product7.com/wp-content/uploads/2018/09/nativesmall.png 200w, https://blog.product7.com/wp-content/uploads/2018/09/nativesmall.png?w=150&amp;h=150 150w" sizes="(max-width: 200px) 100vw, 200px" /></p>
<p>I&#8217;ve always done mobile development in the device native language (Objective-C/Swift for iOS, and Java for Android)</p>
<p>Recently I worked on a project that needed to be deployed on Android, iOS and eventually the web, using the same code base if possible. After reviewing the options I decided to use <a href="https://facebook.github.io/react-native/">React Native</a>.</p>
<p>React Native lets you build mobile apps using only JavaScript. It uses the same design as React, letting you compose a rich mobile UI from declarative components. It is the library used to build Facebook, Instagram, and many other applications.</p>
<p>The project was originally a native Android app &#8211; used by <a href="https://www.ted.com/">TED</a> for handling attendees checking in to individual sessions during a conference. It makes multiple API calls to the server back-end, does <a href="https://en.wikipedia.org/wiki/Near-field_communication">NFC</a> scanning, needs local data storage, and must work offline as well as online.</p>
<p>I&#8217;ll post more further down the road about working in React Native so for now I&#8217;ll list some initial pros and cons&#8230;</p>
<p>Pros</p>
<p>Performance &#8211; better and faster json parsing, cleaner program flow, screen redraw update appears faster than native if state is used properly</p>
<p>Multi-platform &#8211; same code base for Android and iOS, can also develop for web using <a href="https://github.com/necolas/react-native-web">React Native for Web</a>.</p>
<p>Open source &#8211; strongy supported by <a href="https://github.com/facebook">facebook</a>, code available on <a href="https://github.com/facebook/react-native">github</a>, 1,700 contributors, 68,000 stars</p>
<p>Cons</p>
<p>Javascript &#8211; the language still makes me nervous, I like a strongly typed language &#8211; recommend using <a href="https://www.typescriptlang.org/">typescript</a> or <a href="https://flow.org/">flow</a> to lower your risk.</p>
<p>Debugging &#8211; debugging tools aren&#8217;t as mature as I would like, using Chrome and a lot of console.log calls &#8211; which is definitely old school.</p>
<p>Tools &#8211; no integrated tools, I use a mixture of the command line, Chrome, and <a href="https://www.sublimetext.com/">Sublime Text</a> as my editor.</p>
<p>&lt;&gt;</p>
<p>Further reading</p>
<p><a href="https://medium.freecodecamp.org/how-to-get-started-with-react-native-8ef42f65160a">How to Get Started with React Native</a></p>
<p><a href="https://facebook.github.io/react-native/docs/tutorial">The Basics of React Native</a></p>
<p><a href="https://medium.com/react-and-respond/an-ios-developers-journey-into-react-native-8dbb18cca6d0">An iOS Developer’s Journey Into React Native</a></p>
<p><a href="http://makeitopen.com/">Building the F8 App</a></p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/development/" rel="category tag">development</a>, <a href="https://blog.product7.com/category/mobile-development/" rel="category tag">Mobile Development</a>, <a href="https://blog.product7.com/category/mobile-development/react-native/" rel="category tag">React Native</a>, <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/#comments"><b>1</b> Reply</a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-396 -->

				
					
	<article id="post-360" class="post-360 post type-post status-publish format-standard hentry category-development category-uncategorized">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2016/10/29/learning-to-program/" rel="bookmark">Learning to Program</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2016/10/29/learning-to-program/" title="2:29 PM" rel="bookmark"><time class="entry-date" datetime="2016-10-29T14:29:38-05:00">October 29, 2016</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2016/10/29/learning-to-program/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p>I get asked quite often for good sites to learn programming or web site development, here are a few resources I recommend.</p>
<p><a href="https://www.freecodecamp.com/">freeCodeCamp</a> &#8211; the best place to learn html, javscript and the rest of technologies necessary for front end web development, they are also working on a full stack developer course as well &#8211; can&#8217;t recommend these guys enough &#8211; a great intro to web technologies</p>
<p>Google has a <a href="https://www.google.com/about/careers/students/guide-to-technical-development.html">list of resources and a guide</a> intended for Computer Science students seeking an internship or university grad role at Google but it is useful for anyone who is interested in a software development career.</p>
<p><a href="http://www.cs.hmc.edu/csforall/">CS for All</a> is an open book by professors at Harvey Mudd College which teaches the fundamentals of computer science using Python. It&#8217;s an accessible read and perfect for programming beginners.</p>
<p>If you&#8217;ve never programmed before check out the <a href="http://learntocodewith.me/getting-started/">Getting Started</a> page on <a href="http://learntocodewith.me/">Learn To Code with Me</a> by <a href="https://twitter.com/lebdev">Laurence Bradford</a>. She&#8217;s done an incredible job of breaking down the steps beginners should take when they&#8217;re uncertain about where to begin.</p>
<p>This <a href="https://www.youtube.com/watch?v=mvK0UzFNw1Q">short 5 minute video</a> explains why it&#8217;s better to think of projects you&#8217;d like to build and problems you want to solve with programming. Start working on those projects and problems rather than jumping into a specific language that&#8217;s recommended to you by a friend.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/development/" rel="category tag">development</a>, <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2016/10/29/learning-to-program/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-360 -->

				
					
	<article id="post-353" class="post-353 post type-post status-publish format-standard hentry category-android category-mergevr category-mobile-development category-uncategorized tag-game tag-game-dev tag-unity3d">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2016/03/31/vuforia-mergevr-integration/" rel="bookmark">Vuforia / MergeVR&nbsp;Integration</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2016/03/31/vuforia-mergevr-integration/" title="8:22 AM" rel="bookmark"><time class="entry-date" datetime="2016-03-31T08:22:01-05:00">March 31, 2016</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2016/03/31/vuforia-mergevr-integration/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p>This post outlines the steps required to integrate Vuforia for Digital Eyeware with the MergeVR SDK in Unity. The result of this integration will be an Augmented Reality demo app that can be run in the MergeVR headset on your Android device. It will recognize an image marker and display a 3d object on top of that marker, and allow the user to trigger a virtual button on the object &#8211; then enter in VR mode and move around the VR scene using the MergeVR headset capactive input buttons.</p>
<p><a href="https://developer.qualcomm.com/software/vuforia-augmented-reality-sdk" rel="nofollow">https://developer.qualcomm.com/software/vuforia-augmented-reality-sdk</a></p>
<p><a href="http://mergevr.com/" rel="nofollow">http://mergevr.com/</a></p>
<p>&nbsp;</p>
<p><span style="text-decoration:underline;"><strong>Requirements</strong></span></p>
<p>Android mobile device</p>
<p>Unity3d &#8211; version 4.6.*</p>
<p>Vuforia &#8211; Download the core Vuforia unity package &#8211; vuforia-unity-5-0-5 (you must be a registered Vuforia developer before the download) and the eyeware samples vuforia-samples-eyewear-unity-5-0-5</p>
<p>MergeVR &#8211; download latest Merge SDK Unity package- MergeVR_version_v062</p>
<p>&nbsp;</p>
<p><span style="text-decoration:underline;"><strong>Steps</strong></span></p>
<p>&nbsp;</p>
<ul>
<li>Create a new empty Unity Project (4.6.*)</li>
</ul>
<ul>
<li>Import the Merge SDK Unity package (MergeVR_version_v062.unitypackage)</li>
</ul>
<ul>
<li>Import the Vuforia core Unity package (vuforia-unity-5-0-5.unitypackage)</li>
</ul>
<ul>
<li>Import the Vuforia Digital Eyeware sample AR/VR package from the vuforia-samples-eyewear-unity-5-0-5.zip file (arvr-5-0-5.unitypackage)</li>
</ul>
<ul>
<li>In the Scenes folder find the Scene ‘Vuforia-3-AR-VR’ &#8211; Duplicate it (Edit-&gt;Duplicate) and rename the new scene ‘DemoVRAR’</li>
</ul>
<ul>
<li>Open ‘DemoVRAR’ scene.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li>Expand the ‘UserHead’ object and then select ‘ARCamera’ &#8211; enter your Vuforia license key into the ‘App License Key’ field of the inspector. (<a href="https://developer.vuforia.com/license-manager">https://developer.vuforia.com/license-manager</a>)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Run the scene in Unity Editor mode to confirm everything is working correctly. This sample scene uses the stones target marker (available at <a href="https://developer.vuforia.com/sites/default/files/sample-apps/targets/imagetargets_targets.pdf">https://developer.vuforia.com/sites/default/files/sample-apps/targets/imagetargets_targets.pdf</a>). The app should recognize the stones image marker in your camera and display the mountain and trees 3d object.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Stop running the scene (if you haven’t already)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Find the MergeVR -&gt; Prefabs folder. Drag the MergeCameraController and MergeSDK prefabs into the scene Hierarchy.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Expand the MergeCameraController tree.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Click on ARCamera under UserHead and view the Inspector Pane. Check (enable) the ‘Bind Alternate Camera’ property.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Drag the MergeCameralController root transform to the ARCamera property ‘Central Anchor Point’. Drag MergeCameraRight to ‘Right Camera’ (Vuforia will pop up a box saying ‘add vuforia components’ &#8211; click for both right and left cameras), then drag the MergeCameraLeft to ‘Left Camera’</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>On ARCamera property ‘Viewer’ select ‘Other Viewer’ and enter 1 for Viewer ID.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Save the Scene &#8211; now go ahead and build and run this scene on Android &#8211; you should now have a working AR app that can recognize the image stones marker and display the 3d mountain object. If you focus your gaze on the virtual ‘VR’ button for 2 seconds the app will transition you inside the full VR scene where you can look around, to exit the VR scene look straight down and focus on the ‘AR’ button for 2 seconds.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>We now have a working AR/VR app &#8211; we need to make a few modifications to this scene to get it to run best in the MergeVR headset and to let us use the capactive touch buttons on the MergeVR headset to interact with the VR world.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>The MergeVR headset needs the camera on the right side to work in AR mode with the Android, since the generic Vuforia demo doesn’t support this we have to make a few modifications to the MergeVR code to handle the change.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>To move the viewport to the correct position when camera is on the right. Open the ‘MergeScreenManager.cs’ script in MergeVR-&gt;Scripts. In the function ‘SetViewPortResolutionAndPostion’ replace this line</li>
</ul>
<p>&nbsp;</p>
<p>viewportYpos = viewportBottom;</p>
<p>&nbsp;</p>
<p>with</p>
<p>&nbsp;</p>
<p>viewportYpos = viewportBottom+(Screen.height-viewportHeight);</p>
<p>&nbsp;</p>
<p>and in the ‘MergeCameraController.cs’ script in MergeVR-&gt;Scripts comment out the following lines in the function AndroidGyroTracking</p>
<p>&nbsp;</p>
<p>/*</p>
<p><i>if (Input.deviceOrientation==DeviceOrientation.LandscapeRight || Input.deviceOrientation==DeviceOrientation.LandscapeLeft)</i></p>
<p>currentOrientation=Input.deviceOrientation; <i>//only change on either full landscape</i></p>
<p>&nbsp;</p>
<p>if (currentOrientation==DeviceOrientation.LandscapeRight) {</p>
<p>androidGyroRotation = new Quaternion (-Y, X, Z, -W);</p>
<p>androidGyroRotation *= Quaternion.Euler(180f,180f,0);</p>
<p>}</p>
<p>else</p>
<p>*/</p>
<p>&nbsp;</p>
<p>leaving</p>
<p>&nbsp;</p>
<p>androidGyroRotation = new Quaternion (-Y, X, Z, -W); <i>//default</i></p>
<p>&nbsp;</p>
<ul>
<li>Now build and run the app &#8211; the viewports will be aligned correctly and the VR scene will be working as well.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Now we need to add interaction with the VR scene (movement in this example) using the MergeVR capactive touch buttons on the headset.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Add new script called MergeEyeCustom to the MergeCameraController game object in your scene</li>
</ul>
<p>&nbsp;</p>
<p>using UnityEngine;</p>
<p>using System.Collections;</p>
<p>&nbsp;</p>
<p>public class MergeEyeCustom : MonoBehaviour {</p>
<p>&nbsp;</p>
<p>public float speed = 1.5f;</p>
<p>public float jumpSpeed = 10.0f;</p>
<p>public float gravity = 10.0f;</p>
<p>public bool allowJump = false;</p>
<p>&nbsp;</p>
<p>Vector3 moveDirection = Vector3.zero;</p>
<p>float ydirection = 0f;</p>
<p>float xdirection = 0f;</p>
<p>&nbsp;</p>
<p><i>// Use this for initialization</i></p>
<p>void Start () {</p>
<p>&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p><i>// Update is called once per frame</i></p>
<p>void Update () {</p>
<p>&nbsp;</p>
<p>if (Merge.MSDK.isControllerConnected ()) {</p>
<p>ydirection = Merge.MSDK.getController ().GetAxis (&#8220;Vertical&#8221;);</p>
<p>xdirection = Merge.MSDK.getController ().GetAxis (&#8220;Horizontal&#8221;);</p>
<p>} else {</p>
<p><i>//Use arrow keys in editor &#8211; or touch capactive buttons if present in MergeVR headset</i></p>
<p>if (Input.GetKey (KeyCode.UpArrow) || Merge.MergeInput.GetInput(1))</p>
<p>ydirection = -1;</p>
<p>else if (Input.GetKey (KeyCode.DownArrow) || (!allowJump &amp;&amp; Merge.MergeInput.GetInput(0)))</p>
<p>ydirection = 1;</p>
<p>else</p>
<p>ydirection = 0;</p>
<p>&nbsp;</p>
<p>if (Input.GetKey (KeyCode.RightArrow))</p>
<p>xdirection = 1;</p>
<p>else if (Input.GetKey (KeyCode.LeftArrow))</p>
<p>xdirection = -1;</p>
<p>else</p>
<p>xdirection = 0;</p>
<p>}</p>
<p>&nbsp;</p>
<p>moveDirection = new Vector3 (transform.forward.x * ydirection*speed, 0f, transform.forward.z * ydirection*speed);</p>
<p>moveDirection += new Vector3 (transform.right.x * xdirection*speed, 0f, transform.right.z * xdirection*speed);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>transform.position+=moveDirection* Time.deltaTime;</p>
<p>&nbsp;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<ul>
<li>Now you can use the left and right MergeVR headset buttons to move around the scene once you are in VR mode.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>As an exercise you can do the following to polish the example.</li>
</ul>
<p>&nbsp;</p>
<p>remove or modify one of the gaze cursors</p>
<p>&nbsp;</p>
<p>optimize rendering performance</p>
<p>&nbsp;</p>
<p>add a rigid body or first person controller for more realistic collisions the VR scene</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/mobile-development/android/" rel="category tag">Android</a>, <a href="https://blog.product7.com/category/mergevr/" rel="category tag">MergeVR</a>, <a href="https://blog.product7.com/category/mobile-development/" rel="category tag">Mobile Development</a>, <a href="https://blog.product7.com/category/uncategorized/" rel="category tag">Uncategorized</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/game/" rel="tag">game</a>, <a href="https://blog.product7.com/tag/game-dev/" rel="tag">Game Dev</a>, <a href="https://blog.product7.com/tag/unity3d/" rel="tag">Unity3d</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2016/03/31/vuforia-mergevr-integration/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-353 -->

				
					
	<article id="post-339" class="post-339 post type-post status-publish format-standard hentry category-android category-game-development tag-parse tag-unity3d">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2015/06/29/using-parse-sdk-with-unity-running-on-an-android-device/" rel="bookmark">Using Parse SDK with Unity &#8211; running on an Android&nbsp;Device</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2015/06/29/using-parse-sdk-with-unity-running-on-an-android-device/" title="4:36 PM" rel="bookmark"><time class="entry-date" datetime="2015-06-29T16:36:38-05:00">June 29, 2015</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2015/06/29/using-parse-sdk-with-unity-running-on-an-android-device/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p><a href="https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg"><img data-attachment-id="340" data-permalink="https://blog.product7.com/2015/06/29/using-parse-sdk-with-unity-running-on-an-android-device/unityandroid/" data-orig-file="https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg" data-orig-size="204,120" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="unityandroid" data-image-description="" data-image-caption="" data-large-file="https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg?w=204" loading="lazy" class="alignnone size-full wp-image-340" src="https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg" alt="unityandroid" width="204" height="120" srcset="https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg 204w, https://blog.product7.com/wp-content/uploads/2015/06/unityandroid.jpg?w=150&amp;h=88 150w" sizes="(max-width: 204px) 100vw, 204px" /></a></p>
<p>If you are using <a href="https://parse.com/">Parse</a> for your back-end server in a <a href="https://unity3d.com/">Unity</a> app, and you want to deploy the app to Android, you may run into some issues with the built-in Parse plugin. Specifically (at least in my case with Unity 4.6 and Android KitKat) the Parse query object doesn&#8217;t ever return a result.</p>
<p>As a work-around I ended up going with a solution using Unity&#8217;s <a href="http://docs.unity3d.com/ScriptReference/WWW.html">WWW class</a> and the <a href="https://parse.com/docs/rest/guide">Parse REST API</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="brush: csharp; title: ; notranslate" title="">

private IEnumerator GetParseDataForAndroid () {

	//new WWW object
	WWWForm form = new WWWForm();


	//set headers, not sure why but I had to set twice to get it to work
	Hashtable headers = form.headers.AddAuthorizationHeader(&quot;Your-Parse-Application-Id&quot;, &quot;javascript-key=Your-Parse-REST-API-Key&quot;);

	headers.Add(&quot;X-Parse-Application-Id&quot;,&quot;Your-Parse-Application-Id&quot;);
	headers.Add(&quot;X-Parse-REST-API-Keyd&quot;,&quot;Your-Parse-REST-API-Key&quot;);

	WWW parseRequest = new WWW(&quot;https://Your-Parse-Application-Id:javascript-key=Your-Parse-REST-API-Key@api.parse.com/1/classes/yourObject&quot;, null, headers);


		//yield until request is done
		yield return parseRequest;


		//request is done, process results
		Debug.Log (&quot; MergeVRBridge parse query eror result is &quot; + parseRequest.error);


		//using simplejson
		var V = JSON.Parse (parseRequest.text);

		JSONArray results = V [&quot;results&quot;].AsArray;

		for (int i=0; i&lt;results.Count; i++) {

			JSONClass jObject = results[i].AsObject;
			
			//do something interesting with results
			string sTitle = jObject[&quot;title&quot;];
			Debug.Log(&quot; yourObject &quot; + sTitle);

			
			
		}




}


</pre>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/mobile-development/android/" rel="category tag">Android</a>, <a href="https://blog.product7.com/category/mobile-development/ios-iphone-andor-ipad/game-development/" rel="category tag">Game Development</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/parse/" rel="tag">parse</a>, <a href="https://blog.product7.com/tag/unity3d/" rel="tag">Unity3d</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2015/06/29/using-parse-sdk-with-unity-running-on-an-android-device/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-339 -->

				
					
	<article id="post-326" class="post-326 post type-post status-publish format-standard hentry category-android category-mobile-development tag-android tag-unity3d">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2015/03/22/android-studio-and-unity3d/" rel="bookmark">Android Studio and&nbsp;Unity3d</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2015/03/22/android-studio-and-unity3d/" title="10:50 AM" rel="bookmark"><time class="entry-date" datetime="2015-03-22T10:50:25-05:00">March 22, 2015</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2015/03/22/android-studio-and-unity3d/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p>If you are <a href="http://docs.unity3d.com/Manual/PluginsForAndroid.html">building native Android plugins for Unity</a> with Android Studio here are a couple of items that I struggled with. Note that all examples are using <a href="http://unity3d.com/">Unity 4.6</a> and <a href="http://developer.android.com/tools/studio/index.html">Android Studio</a>.</p>
<p>1. Unity Android plugin folder needs a jar file to function &#8211; but Android Studio build process does not produce a class jar file.</p>
<p style="padding-left:30px;">It turns out that Android Studio actually does create a jar file during the build process and stores it in an intermediate location (on the Mac it is in &#8216;build/intermediates/bundles/release/&#8217;).</p>
<p style="padding-left:30px;">Based on suggestions from <a href="http://stackoverflow.com/questions/19034466/how-to-create-a-jar-with-gradle-without-publicly-revealing-source-code">here</a> I created two new tasks in my gradle file &#8211; cleanjar and makejar &#8211; after a build I run both and now have the required jar file in my &#8216;build/outputs/&#8217; folder.</p>
<p style="padding-left:60px;"> task clearJar(type: Delete) {<br />
delete &#8216;build/outputs/MergeVRBridge.jar&#8217;<br />
delete &#8216;build/outputs/AndroidManifest.xml&#8217;<br />
}</p>
<p style="padding-left:60px;">task makeJar(type: Copy) {<br />
from(&#8216;build/intermediates/bundles/release/&#8217;)<br />
into(&#8216;build/outputs/&#8217;)<br />
include(&#8216;classes.jar&#8217;)<br />
include(&#8216;AndroidManifest.xml&#8217;)<br />
rename (&#8216;classes.jar&#8217;, &#8216;MergeVRBridge.jar&#8217;)<br />
}</p>
<p>2. If your Android library file requires a context &#8211; you can pass it to your lib from Unity.</p>
<p style="padding-left:30px;"><span style="font-family:Menlo;"><span style="color:#3363a4;">AndroidJNI</span><span style="font-style:italic;color:#999988;">.</span><span style="font-style:italic;color:#999988;">AttachCurrentThread</span><span style="font-style:italic;color:#999988;">();</span><br />
<span style="color:#444444;">           </span><span style="color:#444444;">androidClass</span><span style="color:#444444;"> = </span><span style="color:#009695;">new</span><span style="color:#444444;"> </span><span style="color:#3363a4;">AndroidJavaClass</span><span style="color:#444444;">(</span><span style="color:#f57c00;">&#8220;</span><span style="color:#f57c00;">com.mergelabs.MergeVR.MergeVRBridge</span><span style="color:#f57c00;">&#8220;</span><span style="color:#444444;">);</span></span></p>
<p><span style="color:#444444;">            </span><span style="color:#009695;">using</span><span style="color:#444444;">(</span><span style="color:#3363a4;">AndroidJavaClass</span><span style="color:#444444;"> </span><span style="color:#444444;">activityClass</span><span style="color:#444444;"> = </span><span style="color:#009695;">new</span><span style="color:#444444;"> </span><span style="color:#3363a4;">AndroidJavaClass</span><span style="color:#444444;">(</span><span style="color:#f57c00;">&#8220;</span><span style="color:#f57c00;">com.unity3d.player.UnityPlayer</span><span style="color:#f57c00;">&#8220;</span><span style="color:#444444;">)) {</span><br />
<span style="color:#444444;">               </span><br />
<span style="color:#444444;">                </span><span style="color:#444444;">activityContext</span><span style="color:#444444;"> = </span><span style="color:#444444;">activityClass</span><span style="color:#444444;">.</span><span style="color:#444444;">GetStatic</span><span style="color:#444444;">&lt;</span><span style="color:#3363a4;">AndroidJavaObject</span><span style="color:#444444;">(</span><span style="color:#f57c00;">&#8220;</span><span style="color:#f57c00;">currentActivity</span><span style="color:#f57c00;">&#8220;</span><span style="color:#444444;">);</span><br />
<span style="color:#444444;">            }</span><br />
<span style="color:#444444;">            </span><span style="color:#444444;">androidClass</span><span style="color:#444444;">.</span><span style="color:#444444;">CallStatic</span><span style="color:#444444;">(</span><span style="color:#f57c00;">&#8220;</span><span style="color:#f57c00;">setContext</span><span style="color:#f57c00;">&#8220;</span><span style="color:#444444;">, </span><span style="color:#444444;">activityContext</span><span style="color:#444444;">);</span><br />
<span style="color:#444444;">            </span><span style="color:#444444;">androidClass</span><span style="color:#444444;">.</span><span style="color:#444444;">CallStatic</span><span style="color:#444444;">&lt;</span><span style="color:#3363a4;">int</span><span style="color:#444444;">&gt;(</span><span style="color:#f57c00;">&#8220;</span><span style="color:#f57c00;">mergeVRInit</span><span style="color:#f57c00;">&#8220;</span><span style="color:#444444;">);</span></p>
<p style="padding-left:30px;">and in your Android Java clase you&#8217;ll have the appropriate function</p>
<p style="padding-left:30px;">private static Context mContext;</p>
<p style="padding-left:30px;"> static public void setContext(Context context) {</p>
<p>mContext = context;<br />
}</p>
<p>3. You need bluetooth permissions set in your Android plugins manifest file.</p>
<p style="padding-left:30px;">If you just copy and paste the manifest file from your Android Studio build directory to the Unity Android plugin directory you will see compile and build errors. It appears in Unity 4.6 that if you place a manifest file in the Android plugin directory it overrides the Unity created manifest file for the entire app.</p>
<p style="padding-left:30px;">The best solution is to find the Unity generated manifest file, copy it to a temp directory and modify by adding any permissions you need (in my case bluetoth related), then add to the Android plugins folder &#8211; Unity will use this manifest file as the default and all will be well.</p>
<p style="padding-left:30px;">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br />
&lt;manifest xmlns:android=&#8221;<a href="http://schemas.android.com/apk/res/android&#038;#8221" rel="nofollow">http://schemas.android.com/apk/res/android&#038;#8221</a>; package=&#8221;com.merge.demo&#8221; android:versionName=&#8221;1.0&#8243; android:versionCode=&#8221;1&#8243; android:installLocation=&#8221;preferExternal&#8221;&gt;</p>
<p>&lt;uses-permission android:name=&#8221;android.permission.BLUETOOTH&#8221;/&gt;<br />
&lt;uses-permission android:name=&#8221;android.permission.BLUETOOTH_ADMIN&#8221;/&gt;<br />
&lt;uses-feature android:name=&#8221;android.hardware.bluetooth_le&#8221; android:required=&#8221;true&#8221;/&gt;</p>
<p>&lt;supports-screens android:smallScreens=&#8221;true&#8221; android:normalScreens=&#8221;true&#8221; android:largeScreens=&#8221;true&#8221; android:xlargeScreens=&#8221;true&#8221; android:anyDensity=&#8221;true&#8221; /&gt;</p>
<p>&lt;application android:theme=&#8221;@android:style/Theme.NoTitleBar&#8221; android:icon=&#8221;@drawable/app_icon&#8221; android:label=&#8221;@string/app_name&#8221; android:debuggable=&#8221;false&#8221;&gt;<br />
&lt;activity android:name=&#8221;com.unity3d.player.UnityPlayerNativeActivity&#8221; android:label=&#8221;@string/app_name&#8221; android:screenOrientation=&#8221;sensorLandscape&#8221; android:launchMode=&#8221;singleTask&#8221; android:configChanges=&#8221;mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale&#8221;&gt;<br />
&lt;intent-filter&gt;<br />
&lt;action android:name=&#8221;android.intent.action.MAIN&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.LAUNCHER&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.LEANBACK_LAUNCHER&#8221; /&gt;<br />
&lt;/intent-filter&gt;<br />
&lt;meta-data android:name=&#8221;unityplayer.UnityActivity&#8221; android:value=&#8221;true&#8221; /&gt;<br />
&lt;meta-data android:name=&#8221;unityplayer.ForwardNativeEventsToDalvik&#8221; android:value=&#8221;false&#8221; /&gt;<br />
&lt;/activity&gt;<br />
&lt;/application&gt;<br />
&lt;uses-sdk android:minSdkVersion=&#8221;18&#8243; android:targetSdkVersion=&#8221;21&#8243; /&gt;<br />
&lt;uses-feature android:glEsVersion=&#8221;0x00020000&#8243; /&gt;<br />
&lt;uses-feature android:name=&#8221;android.hardware.touchscreen&#8221; android:required=&#8221;false&#8221; /&gt;<br />
&lt;uses-feature android:name=&#8221;android.hardware.touchscreen.multitouch&#8221; android:required=&#8221;false&#8221; /&gt;<br />
&lt;uses-feature android:name=&#8221;android.hardware.touchscreen.multitouch.distinct&#8221; android:required=&#8221;false&#8221; /&gt;<br />
&lt;uses-permission android:name=&#8221;android.permission.WAKE_LOCK&#8221; /&gt;<br />
&lt;/manifest&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/mobile-development/android/" rel="category tag">Android</a>, <a href="https://blog.product7.com/category/mobile-development/" rel="category tag">Mobile Development</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/android/" rel="tag">Android</a>, <a href="https://blog.product7.com/tag/unity3d/" rel="tag">Unity3d</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2015/03/22/android-studio-and-unity3d/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-326 -->

				
					
	<article id="post-323" class="post-323 post type-post status-publish format-standard hentry category-game-development category-mobile-development tag-source-control">
		<header class="entry-header">
						<h1 class="entry-title"><a href="https://blog.product7.com/2015/02/19/using-sourcetree-on-the-mac-with-github/" rel="bookmark">Using SourceTree on the Mac with&nbsp;github</a></h1>
			
						<div class="entry-meta">
				<span class="sep">Posted on </span><a href="https://blog.product7.com/2015/02/19/using-sourcetree-on-the-mac-with-github/" title="4:41 PM" rel="bookmark"><time class="entry-date" datetime="2015-02-19T16:41:10-06:00">February 19, 2015</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://blog.product7.com/author/product7llc/" title="View all posts by John Gillespie" rel="author">John Gillespie</a></span></span>			</div><!-- .entry-meta -->
			
						<div class="comments-link">
				<a href="https://blog.product7.com/2015/02/19/using-sourcetree-on-the-mac-with-github/#respond"><span class="leave-reply">Reply</span></a>			</div>
					</header><!-- .entry-header -->

				<div class="entry-content">
			<p><a href="https://blog.product7.com/wp-content/uploads/2015/02/screen-shot-2015-02-19-at-4-40-17-pm.png"><img data-attachment-id="324" data-permalink="https://blog.product7.com/2015/02/19/using-sourcetree-on-the-mac-with-github/screen-shot-2015-02-19-at-4-40-17-pm/" data-orig-file="https://blog.product7.com/wp-content/uploads/2015/02/screen-shot-2015-02-19-at-4-40-17-pm.png" data-orig-size="52,56" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2015-02-19 at 4.40.17 PM" data-image-description="" data-image-caption="" data-large-file="https://blog.product7.com/wp-content/uploads/2015/02/screen-shot-2015-02-19-at-4-40-17-pm.png?w=52" loading="lazy" class="alignnone size-full wp-image-324" src="https://blog.product7.com/wp-content/uploads/2015/02/screen-shot-2015-02-19-at-4-40-17-pm.png" alt="Screen Shot 2015-02-19 at 4.40.17 PM" width="52" height="56" /></a></p>
<p>I&#8217;m using <a href="https://github.com/">github</a> for a large project with multiple developers &#8211; there have been a few wrinkles using the github mac client so we switched to <a href="https://www.atlassian.com/software/sourcetree/overview">SourceTree</a> &#8211; a free github client. We&#8217;re using it to implement <a href="https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/">gitflow</a> &#8211; I&#8217;ve been very happy with it so far &#8211; below is our process&#8230;</p>
<p>&lt;&gt;</p>
<p>Before you start a new feature</p>
<ul>
<li>make sure you have the latest copy of the dev branch (do a fetch on remote, then pull if dev branch shows any changes)</li>
<li>use gitflow command &#8216;new feature&#8217; and name it</li>
<li>make your changes to code</li>
<li>stage files, then commit and push all changes to your feature branch</li>
<li>before finishing feature (merging with development) &#8211; use fetch to check status of development branch,
<ul>
<li>if there have been commits by other members of the team since you downloaded the development branch you will need to merge those changes to your feature branch before finishing the feature
<ul>
<li>checkout the development branch, then pull it to get current</li>
<li>re-checkout your new feature branch</li>
<li>use gitflow &#8216;finish current&#8217; (set to &#8216;delete branch&#8217; and &#8216;force delete&#8217;)</li>
<li>merge conflict message, go to working copy, right click resolve conflicts &#8211; launch external merge tool, choose resolution, file save merge, quit merge tool (do not quit merge tool until you&#8217;re done with all merges</li>
<li>commit and push merge results</li>
<li>now push the new dev branch</li>
</ul>
</li>
<li>if there are no merge issues then just push the new dev branch up to the remote origin</li>
</ul>
</li>
<li>push develop changes up to remote (if not done already)</li>
<li>check github site to confirm your changes are present (just until you are comfortable with this process)</li>
</ul>
					</div><!-- .entry-content -->
		
		<footer class="entry-meta">
			
									<span class="cat-links">
					<span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://blog.product7.com/category/mobile-development/ios-iphone-andor-ipad/game-development/" rel="category tag">Game Development</a>, <a href="https://blog.product7.com/category/mobile-development/" rel="category tag">Mobile Development</a>			</span>
							
									<span class="sep"> | </span>
								<span class="tag-links">
					<span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://blog.product7.com/tag/source-control/" rel="tag">source control</a>			</span>
							
									<span class="sep"> | </span>
						<span class="comments-link"><a href="https://blog.product7.com/2015/02/19/using-sourcetree-on-the-mac-with-github/#respond"><span class="leave-reply">Leave a reply</span></a></span>
			
					</footer><!-- .entry-meta -->
	</article><!-- #post-323 -->

				
							<nav id="nav-below">
				<h3 class="assistive-text">Post navigation</h3>
				<div class="nav-previous"><a href="https://blog.product7.com/page/2/" ><span class="meta-nav">&larr;</span> Older posts</a></div>
				<div class="nav-next"></div>
			</nav><!-- #nav-above -->
			
			
			</div><!-- #content -->
		</div><!-- #primary -->

		<div id="secondary" class="widget-area" role="complementary">
					<aside id="archives-3" class="widget widget_archive"><h3 class="widget-title">Archives</h3>
			<ul>
					<li><a href='https://blog.product7.com/2021/10/'>October 2021</a></li>
	<li><a href='https://blog.product7.com/2021/04/'>April 2021</a></li>
	<li><a href='https://blog.product7.com/2019/06/'>June 2019</a></li>
	<li><a href='https://blog.product7.com/2019/01/'>January 2019</a></li>
	<li><a href='https://blog.product7.com/2018/09/'>September 2018</a></li>
	<li><a href='https://blog.product7.com/2016/10/'>October 2016</a></li>
	<li><a href='https://blog.product7.com/2016/03/'>March 2016</a></li>
	<li><a href='https://blog.product7.com/2015/06/'>June 2015</a></li>
	<li><a href='https://blog.product7.com/2015/03/'>March 2015</a></li>
	<li><a href='https://blog.product7.com/2015/02/'>February 2015</a></li>
	<li><a href='https://blog.product7.com/2014/10/'>October 2014</a></li>
	<li><a href='https://blog.product7.com/2014/08/'>August 2014</a></li>
	<li><a href='https://blog.product7.com/2014/03/'>March 2014</a></li>
	<li><a href='https://blog.product7.com/2014/01/'>January 2014</a></li>
	<li><a href='https://blog.product7.com/2013/12/'>December 2013</a></li>
	<li><a href='https://blog.product7.com/2013/11/'>November 2013</a></li>
	<li><a href='https://blog.product7.com/2013/08/'>August 2013</a></li>
	<li><a href='https://blog.product7.com/2013/05/'>May 2013</a></li>
	<li><a href='https://blog.product7.com/2013/02/'>February 2013</a></li>
	<li><a href='https://blog.product7.com/2012/12/'>December 2012</a></li>
	<li><a href='https://blog.product7.com/2012/06/'>June 2012</a></li>
	<li><a href='https://blog.product7.com/2012/05/'>May 2012</a></li>
	<li><a href='https://blog.product7.com/2012/03/'>March 2012</a></li>
	<li><a href='https://blog.product7.com/2012/02/'>February 2012</a></li>
	<li><a href='https://blog.product7.com/2012/01/'>January 2012</a></li>
	<li><a href='https://blog.product7.com/2011/10/'>October 2011</a></li>
	<li><a href='https://blog.product7.com/2011/09/'>September 2011</a></li>
	<li><a href='https://blog.product7.com/2011/08/'>August 2011</a></li>
			</ul>

			</aside>
		<aside id="recent-posts-3" class="widget widget_recent_entries">
		<h3 class="widget-title">Recent Posts</h3>
		<ul>
											<li>
					<a href="https://blog.product7.com/2021/10/15/overview-of-game-engines-in-2021/">Overview of Game Engines in&nbsp;2021</a>
									</li>
											<li>
					<a href="https://blog.product7.com/2021/04/16/unity3d-game-development-course/">Unity3D Game Development&nbsp;Course</a>
									</li>
											<li>
					<a href="https://blog.product7.com/2019/06/21/using-amazon-sqs-directly-from-amazon-api-gateway/">Using Amazon SQS directly from Amazon API&nbsp;Gateway</a>
									</li>
											<li>
					<a href="https://blog.product7.com/2019/01/17/open-source-alternative-to-unity-and-unreal/">Open source alternative to Unity and&nbsp;Unreal</a>
									</li>
											<li>
					<a href="https://blog.product7.com/2018/09/13/react-native-for-mobile-initial-impressions/">React Native for Mobile &#8211; Initial&nbsp;Impressions</a>
									</li>
					</ul>

		</aside><aside id="wp_tag_cloud-2" class="widget wp_widget_tag_cloud"><h3 class="widget-title"></h3><ul class='wp-tag-cloud' role='list'>
	<li><a href="https://blog.product7.com/tag/3d/" class="tag-cloud-link tag-link-2131 tag-link-position-1" style="font-size: 13.384615384615pt;" aria-label="3d (3 items)">3d</a></li>
	<li><a href="https://blog.product7.com/tag/amazon-aws/" class="tag-cloud-link tag-link-2932846 tag-link-position-2" style="font-size: 8pt;" aria-label="amazon aws (1 item)">amazon aws</a></li>
	<li><a href="https://blog.product7.com/tag/android/" class="tag-cloud-link tag-link-641922 tag-link-position-3" style="font-size: 8pt;" aria-label="Android (1 item)">Android</a></li>
	<li><a href="https://blog.product7.com/tag/arduino/" class="tag-cloud-link tag-link-134289 tag-link-position-4" style="font-size: 11.230769230769pt;" aria-label="arduino (2 items)">arduino</a></li>
	<li><a href="https://blog.product7.com/tag/augmented-reality-hardware/" class="tag-cloud-link tag-link-148042053 tag-link-position-5" style="font-size: 8pt;" aria-label="augmented reality hardware (1 item)">augmented reality hardware</a></li>
	<li><a href="https://blog.product7.com/tag/blog/" class="tag-cloud-link tag-link-273 tag-link-position-6" style="font-size: 8pt;" aria-label="blog (1 item)">blog</a></li>
	<li><a href="https://blog.product7.com/tag/code/" class="tag-cloud-link tag-link-656 tag-link-position-7" style="font-size: 8pt;" aria-label="code (1 item)">code</a></li>
	<li><a href="https://blog.product7.com/tag/design/" class="tag-cloud-link tag-link-148 tag-link-position-8" style="font-size: 8pt;" aria-label="Design (1 item)">Design</a></li>
	<li><a href="https://blog.product7.com/tag/development/" class="tag-cloud-link tag-link-780 tag-link-position-9" style="font-size: 13.384615384615pt;" aria-label="development (3 items)">development</a></li>
	<li><a href="https://blog.product7.com/tag/engine/" class="tag-cloud-link tag-link-40472 tag-link-position-10" style="font-size: 8pt;" aria-label="engine (1 item)">engine</a></li>
	<li><a href="https://blog.product7.com/tag/functional-specification/" class="tag-cloud-link tag-link-411950 tag-link-position-11" style="font-size: 8pt;" aria-label="Functional Specification (1 item)">Functional Specification</a></li>
	<li><a href="https://blog.product7.com/tag/game/" class="tag-cloud-link tag-link-1221 tag-link-position-12" style="font-size: 16.615384615385pt;" aria-label="game (5 items)">game</a></li>
	<li><a href="https://blog.product7.com/tag/game-center/" class="tag-cloud-link tag-link-1466975 tag-link-position-13" style="font-size: 11.230769230769pt;" aria-label="game center (2 items)">game center</a></li>
	<li><a href="https://blog.product7.com/tag/game-dev/" class="tag-cloud-link tag-link-62764 tag-link-position-14" style="font-size: 16.615384615385pt;" aria-label="Game Dev (5 items)">Game Dev</a></li>
	<li><a href="https://blog.product7.com/tag/game-development-2/" class="tag-cloud-link tag-link-35003694 tag-link-position-15" style="font-size: 8pt;" aria-label="game development (1 item)">game development</a></li>
	<li><a href="https://blog.product7.com/tag/git/" class="tag-cloud-link tag-link-209196 tag-link-position-16" style="font-size: 8pt;" aria-label="git (1 item)">git</a></li>
	<li><a href="https://blog.product7.com/tag/github/" class="tag-cloud-link tag-link-5603054 tag-link-position-17" style="font-size: 8pt;" aria-label="github (1 item)">github</a></li>
	<li><a href="https://blog.product7.com/tag/google-app-engine/" class="tag-cloud-link tag-link-6023209 tag-link-position-18" style="font-size: 11.230769230769pt;" aria-label="Google App Engine (2 items)">Google App Engine</a></li>
	<li><a href="https://blog.product7.com/tag/ios/" class="tag-cloud-link tag-link-324281 tag-link-position-19" style="font-size: 22pt;" aria-label="iOS (11 items)">iOS</a></li>
	<li><a href="https://blog.product7.com/tag/ipad/" class="tag-cloud-link tag-link-580102 tag-link-position-20" style="font-size: 15.179487179487pt;" aria-label="iPad (4 items)">iPad</a></li>
	<li><a href="https://blog.product7.com/tag/iphone/" class="tag-cloud-link tag-link-106595 tag-link-position-21" style="font-size: 16.615384615385pt;" aria-label="iPhone (5 items)">iPhone</a></li>
	<li><a href="https://blog.product7.com/tag/kickstarter/" class="tag-cloud-link tag-link-344761 tag-link-position-22" style="font-size: 8pt;" aria-label="kickstarter (1 item)">kickstarter</a></li>
	<li><a href="https://blog.product7.com/tag/mason-county-news/" class="tag-cloud-link tag-link-21651967 tag-link-position-23" style="font-size: 8pt;" aria-label="Mason County News (1 item)">Mason County News</a></li>
	<li><a href="https://blog.product7.com/tag/news/" class="tag-cloud-link tag-link-103 tag-link-position-24" style="font-size: 11.230769230769pt;" aria-label="news (2 items)">news</a></li>
	<li><a href="https://blog.product7.com/tag/parse/" class="tag-cloud-link tag-link-807384 tag-link-position-25" style="font-size: 15.179487179487pt;" aria-label="parse (4 items)">parse</a></li>
	<li><a href="https://blog.product7.com/tag/pdf/" class="tag-cloud-link tag-link-47759 tag-link-position-26" style="font-size: 8pt;" aria-label="pdf (1 item)">pdf</a></li>
	<li><a href="https://blog.product7.com/tag/pdfcrowd/" class="tag-cloud-link tag-link-63668369 tag-link-position-27" style="font-size: 8pt;" aria-label="pdfcrowd (1 item)">pdfcrowd</a></li>
	<li><a href="https://blog.product7.com/tag/physics/" class="tag-cloud-link tag-link-1211 tag-link-position-28" style="font-size: 11.230769230769pt;" aria-label="physics (2 items)">physics</a></li>
	<li><a href="https://blog.product7.com/tag/python/" class="tag-cloud-link tag-link-832 tag-link-position-29" style="font-size: 11.230769230769pt;" aria-label="python (2 items)">python</a></li>
	<li><a href="https://blog.product7.com/tag/resources/" class="tag-cloud-link tag-link-1784 tag-link-position-30" style="font-size: 8pt;" aria-label="Resources (1 item)">Resources</a></li>
	<li><a href="https://blog.product7.com/tag/robotics-2/" class="tag-cloud-link tag-link-34971367 tag-link-position-31" style="font-size: 11.230769230769pt;" aria-label="robotics (2 items)">robotics</a></li>
	<li><a href="https://blog.product7.com/tag/security/" class="tag-cloud-link tag-link-801 tag-link-position-32" style="font-size: 8pt;" aria-label="security (1 item)">security</a></li>
	<li><a href="https://blog.product7.com/tag/server/" class="tag-cloud-link tag-link-18568 tag-link-position-33" style="font-size: 11.230769230769pt;" aria-label="server (2 items)">server</a></li>
	<li><a href="https://blog.product7.com/tag/source-control/" class="tag-cloud-link tag-link-53511 tag-link-position-34" style="font-size: 11.230769230769pt;" aria-label="source control (2 items)">source control</a></li>
	<li><a href="https://blog.product7.com/tag/space-combat/" class="tag-cloud-link tag-link-7700784 tag-link-position-35" style="font-size: 11.230769230769pt;" aria-label="space combat (2 items)">space combat</a></li>
	<li><a href="https://blog.product7.com/tag/sparkfun/" class="tag-cloud-link tag-link-4012181 tag-link-position-36" style="font-size: 8pt;" aria-label="sparkfun (1 item)">sparkfun</a></li>
	<li><a href="https://blog.product7.com/tag/torchships/" class="tag-cloud-link tag-link-79420918 tag-link-position-37" style="font-size: 13.384615384615pt;" aria-label="Torchships (3 items)">Torchships</a></li>
	<li><a href="https://blog.product7.com/tag/unity3d/" class="tag-cloud-link tag-link-3829383 tag-link-position-38" style="font-size: 15.179487179487pt;" aria-label="Unity3d (4 items)">Unity3d</a></li>
	<li><a href="https://blog.product7.com/tag/web2py/" class="tag-cloud-link tag-link-4426879 tag-link-position-39" style="font-size: 13.384615384615pt;" aria-label="web2py (3 items)">web2py</a></li>
	<li><a href="https://blog.product7.com/tag/xcode/" class="tag-cloud-link tag-link-176525 tag-link-position-40" style="font-size: 11.230769230769pt;" aria-label="xCode (2 items)">xCode</a></li>
</ul>
</aside><aside id="blog_subscription-4" class="widget widget_blog_subscription jetpack_subscription_widget"><h3 class="widget-title"><label for="subscribe-field">Email Subscription</label></h3>

			<div class="wp-block-jetpack-subscriptions__container">
			<form
				action="https://subscribe.wordpress.com"
				method="post"
				accept-charset="utf-8"
				data-blog="21774431"
				data-post_access_level="everybody"
				id="subscribe-blog"
			>
				<p>Enter your email address to subscribe to this blog and receive notifications of new posts by email.</p>
				<p id="subscribe-email">
					<label
						id="subscribe-field-label"
						for="subscribe-field"
						class="screen-reader-text"
					>
						Email Address:					</label>

					<input
							type="email"
							name="email"
							autocomplete="email"
							
							style="width: 95%; padding: 1px 10px"
							placeholder="Email Address"
							value=""
							id="subscribe-field"
							required
						/>				</p>

				<p id="subscribe-submit"
									>
					<input type="hidden" name="action" value="subscribe"/>
					<input type="hidden" name="blog_id" value="21774431"/>
					<input type="hidden" name="source" value="https://blog.product7.com/"/>
					<input type="hidden" name="sub-type" value="widget"/>
					<input type="hidden" name="redirect_fragment" value="subscribe-blog"/>
					<input type="hidden" id="_wpnonce" name="_wpnonce" value="346aa05148" />					<button type="submit"
													class="wp-block-button__link"
																	>
						Sign me up!					</button>
				</p>
			</form>
							<div class="wp-block-jetpack-subscriptions__subscount">
					Join 12 other subscribers				</div>
						</div>
			
</aside><aside id="twitter-3" class="widget widget_twitter"><h3 class="widget-title"><a href='http://twitter.com/johngillespie'>Twitter Updates</a></h3><a class="twitter-timeline" data-height="600" data-dnt="true" href="https://twitter.com/johngillespie">Tweets by johngillespie</a></aside>		</div><!-- #secondary .widget-area -->

	</div><!-- #main -->

	<footer id="colophon">

			

			<div id="site-generator">
				 								<a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a>
			</div>
	</footer><!-- #colophon -->
</div><!-- #page -->

		<script type="text/javascript">
		var infiniteScroll = {"settings":{"id":"content","ajaxurl":"https://blog.product7.com/?infinity=scrolling","type":"scroll","wrapper":true,"wrapper_class":"infinite-wrap","footer":"page","click_handle":"1","text":"Older posts","totop":"Scroll back to top","currentday":"19.02.15","order":"DESC","scripts":[],"styles":[],"google_analytics":false,"offset":1,"history":{"host":"blog.product7.com","path":"/page/%d/","use_trailing_slashes":true,"parameters":""},"query_args":{"error":"","m":"","p":0,"post_parent":"","subpost":"","subpost_id":"","attachment":"","attachment_id":0,"name":"","pagename":"","page_id":0,"second":"","minute":"","hour":"","day":0,"monthnum":0,"year":0,"w":0,"category_name":"","tag":"","cat":"","tag_id":"","author":"","author_name":"","feed":"","tb":"","paged":0,"meta_key":"","meta_value":"","preview":"","s":"","sentence":"","title":"","fields":"all","menu_order":"","embed":"","category__in":[],"category__not_in":[],"category__and":[],"post__in":[],"post__not_in":[],"post_name__in":[],"tag__in":[],"tag__not_in":[],"tag__and":[],"tag_slug__in":[],"tag_slug__and":[],"post_parent__in":[],"post_parent__not_in":[],"author__in":[],"author__not_in":[],"search_columns":[],"lazy_load_term_meta":false,"posts_per_page":10,"ignore_sticky_posts":false,"suppress_filters":false,"cache_results":true,"update_post_term_cache":true,"update_menu_item_cache":false,"update_post_meta_cache":true,"post_type":"","nopaging":false,"comments_per_page":"50","no_found_rows":false,"order":"DESC"},"query_before":"2026-04-23 12:14:45","last_post_date":"2015-02-19 16:41:10","body_class":"infinite-scroll neverending","loading_text":"Loading new page","stats":"blog=21774431\u0026v=wpcom\u0026tz=-5\u0026user_id=0\u0026arch_home=1\u0026subd=product7llc\u0026x_pagetype=infinite"}};
		</script>
		<!--  -->
<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/files/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/pub/twentyeleven/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script id="grofiles-cards-js" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=202617d1133547e8a1f2801609f51cef12522abe7f6647d869e9fbc974fe356a37e613"></script>
<script id="wpgroho-js-extra">
var WPGroHo = {"my_hash":""};
//# sourceURL=wpgroho-js-extra
</script>
<script crossorigin='anonymous' type='text/javascript'  src='/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script>

	<script>
		// Initialize and attach hovercards to all gravatars
		( function() {
			function init() {
				if ( typeof Gravatar === 'undefined' ) {
					return;
				}

				if ( typeof Gravatar.init !== 'function' ) {
					return;
				}

				Gravatar.profile_cb = function ( hash, id ) {
					WPGroHo.syncProfileData( hash, id );
				};

				Gravatar.my_hash = WPGroHo.my_hash;
				Gravatar.init(
					'body',
					'#wp-admin-bar-my-account',
					{
						i18n: {
							'Edit your profile →': 'Edit your profile →',
							'View profile →': 'View profile →',
							'Contact': 'Contact',
							'Send money': 'Send money',
							'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.',
							'Gravatar not found.': 'Gravatar not found.',
							'Too Many Requests.': 'Too Many Requests.',
							'Internal Server Error.': 'Internal Server Error.',
							'Is this you?': 'Is this you?',
							'Claim your free profile.': 'Claim your free profile.',
							'Email': 'Email',
							'Home Phone': 'Home Phone',
							'Work Phone': 'Work Phone',
							'Cell Phone': 'Cell Phone',
							'Contact Form': 'Contact Form',
							'Calendar': 'Calendar',
						},
					}
				);
			}

			if ( document.readyState !== 'loading' ) {
				init();
			} else {
				document.addEventListener( 'DOMContentLoaded', init );
			}
		} )();
	</script>

		<div style="display:none">
	</div>
		<div id="infinite-footer">
			<div class="container">
				<div class="blog-info">
					<a id="infinity-blog-title" href="https://blog.product7.com/" rel="home">
						Product7					</a>
				</div>
				<div class="blog-credits">
					<a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> 				</div>
			</div>
		</div><!-- #infinite-footer -->
				<div id="actionbar" dir="ltr" style="display: none;"
			class="actnbr-pub-twentyeleven actnbr-has-follow actnbr-has-actions">
		<ul>
								<li class="actnbr-btn actnbr-hidden">
								<a class="actnbr-action actnbr-actn-follow " href="">
			<svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z"  fill-rule="evenodd"></path></svg>
			<span>Subscribe</span>
		</a>
		<a class="actnbr-action actnbr-actn-following  no-display" href="">
			<svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg>
			<span>Subscribed</span>
		</a>
							<div class="actnbr-popover tip tip-top-left actnbr-notice" id="follow-bubble">
							<div class="tip-arrow"></div>
							<div class="tip-inner actnbr-follow-bubble">
															<ul>
											<li class="actnbr-sitename">
			<a href="https://blog.product7.com">
				<img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' />				Product7			</a>
		</li>
										<div class="actnbr-message no-display"></div>
									<form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;">
																				<div>
										<input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address" />
										</div>
										<input type="hidden" name="action" value="subscribe" />
										<input type="hidden" name="blog_id" value="21774431" />
										<input type="hidden" name="source" value="https://blog.product7.com/" />
										<input type="hidden" name="sub-type" value="actionbar-follow" />
										<input type="hidden" id="_wpnonce" name="_wpnonce" value="346aa05148" />										<div class="actnbr-button-wrap">
											<button type="submit" value="Sign me up">
												Sign me up											</button>
										</div>
									</form>
									<li class="actnbr-login-nudge">
										<div>
											Already have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.product7.com%252F2021%252F10%252F15%252Foverview-of-game-engines-in-2021%252F">Log in now.</a>										</div>
									</li>
								</ul>
															</div>
						</div>
					</li>
							<li class="actnbr-ellipsis actnbr-hidden">
				<svg class="gridicon gridicons-ellipsis" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M7 12c0 1.104-.896 2-2 2s-2-.896-2-2 .896-2 2-2 2 .896 2 2zm12-2c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2zm-7 0c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2z"/></g></svg>				<div class="actnbr-popover tip tip-top-left actnbr-more">
					<div class="tip-arrow"></div>
					<div class="tip-inner">
						<ul>
								<li class="actnbr-sitename">
			<a href="https://blog.product7.com">
				<img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/a7b7e6d28cdb35391e3b2b1aef0328f14f9b911939d956cb6843787612f3f008?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' />				Product7			</a>
		</li>
								<li class="actnbr-folded-follow">
										<a class="actnbr-action actnbr-actn-follow " href="">
			<svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z"  fill-rule="evenodd"></path></svg>
			<span>Subscribe</span>
		</a>
		<a class="actnbr-action actnbr-actn-following  no-display" href="">
			<svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg>
			<span>Subscribed</span>
		</a>
								</li>
														<li class="actnbr-signup"><a href="https://wordpress.com/start/">Sign up</a></li>
							<li class="actnbr-login"><a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.product7.com%252F2021%252F10%252F15%252Foverview-of-game-engines-in-2021%252F">Log in</a></li>
															<li class="flb-report">
									<a href="https://wordpress.com/abuse/?report_url=https://blog.product7.com" target="_blank" rel="noopener noreferrer">
										Report this content									</a>
								</li>
															<li class="actnbr-reader">
									<a href="https://wordpress.com/reader/feeds/634136">
										View site in Reader									</a>
								</li>
															<li class="actnbr-subs">
									<a href="https://subscribe.wordpress.com/">Manage subscriptions</a>
								</li>
																<li class="actnbr-fold"><a href="">Collapse this bar</a></li>
														</ul>
					</div>
				</div>
			</li>
		</ul>
	</div>
	
<script>
window.addEventListener( "DOMContentLoaded", function( event ) {
	var link = document.createElement( "link" );
	link.href = "/wp-content/mu-plugins/actionbar/actionbar.css?v=20250116";
	link.type = "text/css";
	link.rel = "stylesheet";
	document.head.appendChild( link );

	var script = document.createElement( "script" );
	script.src = "/wp-content/mu-plugins/actionbar/actionbar.js?v=20250204";
	document.body.appendChild( script );
} );
</script>

			<div id="jp-carousel-loading-overlay">
			<div id="jp-carousel-loading-wrapper">
				<span id="jp-carousel-library-loading">&nbsp;</span>
			</div>
		</div>
		<div class="jp-carousel-overlay" style="display: none;">

		<div class="jp-carousel-container">
			<!-- The Carousel Swiper -->
			<div
				class="jp-carousel-wrap swiper jp-carousel-swiper-container jp-carousel-transitions"
				itemscope
				itemtype="https://schema.org/ImageGallery">
				<div class="jp-carousel swiper-wrapper"></div>
				<div class="jp-swiper-button-prev swiper-button-prev">
					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
						<mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12">
							<path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/>
						</mask>
						<g mask="url(#maskPrev)">
							<rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/>
						</g>
					</svg>
				</div>
				<div class="jp-swiper-button-next swiper-button-next">
					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
						<mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12">
							<path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/>
						</mask>
						<g mask="url(#maskNext)">
							<rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/>
						</g>
					</svg>
				</div>
			</div>
			<!-- The main close buton -->
			<div class="jp-carousel-close-hint">
				<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
					<mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14">
						<path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/>
					</mask>
					<g mask="url(#maskClose)">
						<rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/>
					</g>
				</svg>
			</div>
			<!-- Image info, comments and meta -->
			<div class="jp-carousel-info">
				<div class="jp-carousel-info-footer">
					<div class="jp-carousel-pagination-container">
						<div class="jp-swiper-pagination swiper-pagination"></div>
						<div class="jp-carousel-pagination"></div>
					</div>
					<div class="jp-carousel-photo-title-container">
						<h2 class="jp-carousel-photo-caption"></h2>
					</div>
					<div class="jp-carousel-photo-icons-container">
						<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility">
							<span class="jp-carousel-icon">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/>
									</mask>
									<g mask="url(#maskInfo)">
										<rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>
							</span>
						</a>
												<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility">
							<span class="jp-carousel-icon">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/>
									</mask>
									<g mask="url(#maskComments)">
										<rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>

								<span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span>
							</span>
						</a>
											</div>
				</div>
				<div class="jp-carousel-info-extra">
					<div class="jp-carousel-info-content-wrapper">
						<div class="jp-carousel-photo-title-container">
							<h2 class="jp-carousel-photo-title"></h2>
						</div>
						<div class="jp-carousel-comments-wrapper">
															<div id="jp-carousel-comments-loading">
									<span>Loading Comments...</span>
								</div>
								<div class="jp-carousel-comments"></div>
								<div id="jp-carousel-comment-form-container">
									<span id="jp-carousel-comment-form-spinner">&nbsp;</span>
									<div id="jp-carousel-comment-post-results"></div>
																														<form id="jp-carousel-comment-form">
												<label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label>
												<textarea
													name="comment"
													class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea"
													id="jp-carousel-comment-form-comment-field"
													placeholder="Write a Comment..."
												></textarea>
												<div id="jp-carousel-comment-form-submit-and-info-wrapper">
													<div id="jp-carousel-comment-form-commenting-as">
																													<fieldset>
																<label for="jp-carousel-comment-form-email-field">Email (Required)</label>
																<input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" />
															</fieldset>
															<fieldset>
																<label for="jp-carousel-comment-form-author-field">Name (Required)</label>
																<input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" />
															</fieldset>
															<fieldset>
																<label for="jp-carousel-comment-form-url-field">Website</label>
																<input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" />
															</fieldset>
																											</div>
													<input
														type="submit"
														name="submit"
														class="jp-carousel-comment-form-button"
														id="jp-carousel-comment-form-button-submit"
														value="Post Comment" />
												</div>
											</form>
																											</div>
													</div>
						<div class="jp-carousel-image-meta">
							<div class="jp-carousel-title-and-caption">
								<div class="jp-carousel-photo-info">
									<h3 class="jp-carousel-caption" itemprop="caption description"></h3>
								</div>

								<div class="jp-carousel-photo-description"></div>
							</div>
							<ul class="jp-carousel-image-exif" style="display: none;"></ul>
							<a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/>
									</mask>
									<g mask="url(#mask0)">
										<rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>
								<span class="jp-carousel-download-text"></span>
							</a>
							<div class="jp-carousel-image-map" style="display: none;"></div>
						</div>
					</div>
				</div>
			</div>
		</div>

		</div>
		<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJzTLy/QTc7PK0nNK9EvyClNz8wr1i+uzCtJrMjITM/IAeKS1CJMEWP94uSizIISoOIM5/yiVL2sYh19yo1yKioFmheckVhUADTRPtfW0NTcwMjAxNLCNAsAVZ1Axw=='></script>
<script type='text/javascript'>
	(function(){
		var corecss = document.createElement('link');
		var themecss = document.createElement('link');
		var corecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
		if ( corecss.setAttribute ) {
				corecss.setAttribute( "rel", "stylesheet" );
				corecss.setAttribute( "type", "text/css" );
				corecss.setAttribute( "href", corecssurl );
		} else {
				corecss.rel = "stylesheet";
				corecss.href = corecssurl;
		}
		document.head.appendChild( corecss );
		var themecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?m=1363304414i&amp;ver=3.0.9b";
		if ( themecss.setAttribute ) {
				themecss.setAttribute( "rel", "stylesheet" );
				themecss.setAttribute( "type", "text/css" );
				themecss.setAttribute( "href", themecssurl );
		} else {
				themecss.rel = "stylesheet";
				themecss.href = themecssurl;
		}
		document.head.appendChild( themecss );
	})();
	SyntaxHighlighter.config.strings.expandSource = '+ expand source';
	SyntaxHighlighter.config.strings.help = '?';
	SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
	SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
	SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
	SyntaxHighlighter.defaults['pad-line-numbers'] = false;
	SyntaxHighlighter.defaults['toolbar'] = false;
	SyntaxHighlighter.all();

	// Infinite scroll support
	document.addEventListener( 'is.post-load', function () {
		SyntaxHighlighter.highlight();
	} );
</script>

	<script type="text/javascript">
		(function () {
			var wpcom_reblog = {
				source: 'toolbar',

				toggle_reblog_box_flair: function (obj_id, post_id) {

					// Go to site selector. This will redirect to their blog if they only have one.
					const postEndpoint = `https://wordpress.com/post`;

					// Ideally we would use the permalink here, but fortunately this will be replaced with the 
					// post permalink in the editor.
					const originalURL = `${ document.location.href }?page_id=${ post_id }`; 
					
					const url =
						postEndpoint +
						'?url=' +
						encodeURIComponent( originalURL ) +
						'&is_post_share=true' +
						'&v=5';

					const redirect = function () {
						if (
							! window.open( url, '_blank' )
						) {
							location.href = url;
						}
					};

					if ( /Firefox/.test( navigator.userAgent ) ) {
						setTimeout( redirect, 0 );
					} else {
						redirect();
					}
				},
			};

			window.wpcom_reblog = wpcom_reblog;
		})();
	</script>
<script id="jetpack-carousel-js-extra">
var jetpackSwiperLibraryPath = {"url":"/wp-content/mu-plugins/jetpack-plugin/moon/_inc/blocks/swiper.js"};
var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https://blog.product7.com/wp-admin/admin-ajax.php","nonce":"6af2731474","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size \u003Cspan class=\"photo-size\"\u003E{0}\u003Cspan class=\"photo-size-times\"\u003E\u00d7\u003C/span\u003E{1}\u003C/span\u003E","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https://product7llc.wordpress.com/wp-login.php?redirect_to=https%3A%2F%2Fblog.product7.com%2F2019%2F06%2F21%2Fusing-amazon-sqs-directly-from-amazon-api-gateway%2F","blog_id":"21774431","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=21774431&v=wpcom&tz=-5&user_id=0&arch_home=1&subd=product7llc","is_public":"1"};
//# sourceURL=jetpack-carousel-js-extra
</script>
<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJydjMENgzAMABcimKjQvBCjVNSklYNjRyRRxfZ8oAPwvNPp4JcMqhQvBWI1ieuXJEPwJc24ngxRVeBFgvCuxAuQfEioeJNxU+aL9zaStCE3cOuK86Y1e/53lzi3Uxytc4N9Dt2jDwfXLkT4'></script>
<script id="twitter-widgets-js" src="https://platform.twitter.com/widgets.js?ver=20111117"></script>
<script data-wp-strategy="defer" defer id="tiled-gallery-js" src="/wp-content/mu-plugins/jetpack-plugin/moon/_inc/build/tiled-gallery/tiled-gallery/tiled-gallery.min.js?m=1755006225i&#038;ver=15.8-a.6"></script>
<script crossorigin='anonymous' type='text/javascript'  src='/wp-content/mu-plugins/carousel-wpcom/carousel-wpcom.js?m=1761899756i'></script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/","ext":".png","svgUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/","svgExt":".svg","source":{"concatemoji":"/wp-includes/js/wp-emoji-release.min.js?m=1764078722i&ver=7.0-RC2-62212"}}
</script>
<script type="module">
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=/wp-includes/js/wp-emoji-loader.min.js
</script>
		<script type="text/javascript">
			(function() {
				var extend = function(out) {
					out = out || {};

					for (var i = 1; i < arguments.length; i++) {
						if (!arguments[i])
						continue;

						for (var key in arguments[i]) {
						if (arguments[i].hasOwnProperty(key))
							out[key] = arguments[i][key];
						}
					}

					return out;
				};
				extend( window.infiniteScroll.settings.scripts, ["jetpack-mu-wpcom-settings","rlt-proxy","wpcom-actionbar-placeholder","grofiles-cards","wpgroho","syntaxhighlighter-core","syntaxhighlighter-brush-csharp","the-neverending-homepage","jetpack-carousel","twitter-widgets","tiled-gallery","carousel-wpcom"] );
				extend( window.infiniteScroll.settings.styles, ["the-neverending-homepage","coblocks-frontend","wpcom-core-compat-playlist-styles","wpcom-bbpress2-staff-css","twentyeleven-block-style","twentyeleven-wpcom-style","reblogging","geo-location-flair","infinity-twentyeleven","h4-global","wp-emoji-styles","wp-block-library","classic-theme-styles","wp-block-styles-placeholder","wp-global-styles-placeholder","jetpack-global-styles-frontend-style","wp-block-paragraph","wp-block-paragraph-theme","global-styles","jetpack-swiper-library","jetpack-carousel","jetpack-subscriptions","tiled-gallery","core-block-supports-duotone"] );
			})();
		</script>
				<span id="infinite-aria" aria-live="polite"></span>
		<script src="//stats.wp.com/w.js?68" defer></script> <script type="text/javascript">
_tkq = window._tkq || [];
_stq = window._stq || [];
_tkq.push(['storeContext', {'blog_id':'21774431','blog_tz':'-5','user_lang':'en','blog_lang':'en','user_id':'0'}]);
		// Prevent sending pageview tracking from WP-Admin pages.
		_stq.push(['view', {'blog':'21774431','v':'wpcom','tz':'-5','user_id':'0','arch_home':'1','subd':'product7llc'}]);
		_stq.push(['extra', {'crypt':'UE5tW3cvZGQ/JUs1UEo3MlhbTHVDVTRvbmM3RjIzb05bci89VFVBXWJyUHxLW3UxSX56MnYtQWFmLUVKa1c5MHc4NmJRUjA2Lm1xcVBTNGttVzNFSFFHb2Z1TF9oJlY2cDlGSnAmVC5YSVJ8QSY0LHdXby1VM2FHTkZ3SkYzV290LmRqJlNxU3VNY2J3SFJUUHNHLUNhdTI9V11YLnlfPy0xW0J+TWp2W0VleDMmR3lsfDB2S1s4LEMwa2U2TUJQQ1luQngwL1F4PU1RTWwyNkVILWVZZW9hVVdWQUlBTHc='}]);
_stq.push([ 'clickTrackerInit', '21774431', '0' ]);
</script>
<noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript>
<meta id="bilmur" property="bilmur:data" content="" data-provider="wordpress.com" data-service="simple" data-site-tz="America/Chicago" data-custom-props="{&quot;logged_in&quot;:&quot;0&quot;,&quot;wptheme&quot;:&quot;pub\/twentyeleven&quot;,&quot;wptheme_is_block&quot;:&quot;0&quot;}"  >
		<script defer src="/wp-content/js/bilmur.min.js?i=17&amp;m=202617"></script> 	
</body>
</html>