1<!DOCTYPE html> 2<html class="no-js mh-one-sb" lang="en-GB"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<link rel="profile" href="http://gmpg.org/xfn/11" /> 7<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> 8 9 <!-- This site is optimized with the Yoast SEO plugin v28.6 - https://yoast.com/product/yoast-seo-wordpress/ --> 10 <title>DektopLiberation - Desktop liberation</title> 11 <meta name="description" content="Desktop Liberation aims to help you use cloud based APIS and services without being constrained by your desktop software." /> 12 <link rel="canonical" href="https://ramblings.mcpher.com/" /> 13 <meta name="twitter:card" content="summary_large_image" /> 14 <meta name="twitter:title" content="DektopLiberation - Desktop liberation" /> 15 <meta name="twitter:description" content="Desktop Liberation aims to help you use cloud based APIS and services without being constrained by your desktop software." /> 16 <meta name="twitter:site" content="@brucemcpherson" /> 17
17<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ramblings.mcpher.com\/","url":"https:\/\/ramblings.mcpher.com\/","name":"DektopLiberation - Desktop liberation","isPartOf":{"@id":"https:\/\/ramblings.mcpher.com\/#website"},"about":{"@id":"https:\/\/ramblings.mcpher.com\/#\/schema\/person\/069b96a8a34c876dcd4894f05f56055d"},"primaryImageOfPage":{"@id":"https:\/\/ramblings.mcpher.com\/#primaryimage"},"image":{"@id":"https:\/\/ramblings.mcpher.com\/#primaryimage"},"thumbnailUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2019\/11\/going-gas-e1580831309419.jpg","datePublished":"2019-12-02T10:36:38+00:00","dateModified":"2024-10-18T11:56:56+00:00","description":"Desktop Liberation aims to help you use cloud based APIS and services without being constrained by your desktop software.","breadcrumb":{"@id":"https:\/\/ramblings.mcpher.com\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ramblings.mcpher.com\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ramblings.mcpher.com\/#primaryimage","url":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2019\/11\/going-gas-e1580831309419.jpg","contentUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2019\/11\/going-gas-e1580831309419.jpg","width":326,"height":427},{"@type":"BreadcrumbList","@id":"https:\/\/ramblings.mcpher.com\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home"}]},{"@type":"WebSite","@id":"https:\/\/ramblings.mcpher.com\/#website","url":"https:\/\/ramblings.mcpher.com\/","name":"Desktop liberation","description":"The definitive resource for Google Workspace and Cloud automation","publisher":{"@id":"https:\/\/ramblings.mcpher.com\/#\/schema\/person\/069b96a8a34c876dcd4894f05f56055d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ramblings.mcpher.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/ramblings.mcpher.com\/#\/schema\/person\/069b96a8a34c876dcd4894f05f56055d","name":"brucemcp","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","url":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","contentUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","width":512,"height":512,"caption":"brucemcp"},"logo":{"@id":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png"},"description":"I am a Google Developer Expert and decided to investigate Google Apps Script in my spare time. The more I investigated the more content I created so this site is extremely rich. Now, in 2019, a lot of things have disappeared or donât work anymore due to Google having retired some stuff. I am however leaving things as is and where I came across some deprecated stuff, I have indicated it. I decided to write a book about it and to also create videos to teach developers who want to learn Google Apps Script. If you find the material contained in this site useful, you can support me by buying my books and or videos.","sameAs":["https:\/\/x.com\/https:\/\/ramblings.mcpher.com\/https\/\/twitter.com\/brucemcpherson"]}]}</script>
17 18 <meta name="google-site-verification" content="ap1oNIyQTSLKZoS5bncBPhLxGu83oAIpwsnUAYyT4Yk" /> 19 <!-- / Yoast SEO plugin. --> 20 21 22<link rel='dns-prefetch' href='//www.googletagmanager.com' /> 23<link rel='dns-prefetch' href='//fonts.googleapis.com' /> 24<link rel='dns-prefetch' href='//pagead2.googlesyndication.com' /> 25<link rel='dns-prefetch' href='//fundingchoicesmessages.google.com' /> 26<link rel="alternate" type="application/rss+xml" title="Desktop liberation » Feed" href="https://ramblings.mcpher.com/feed/" /> 27<link rel="alternate" type="application/rss+xml" title="Desktop liberation » Comments Feed" href="https://ramblings.mcpher.com/comments/feed/" /> 28<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://ramblings.mcpher.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Framblings.mcpher.com%2F" /> 29<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://ramblings.mcpher.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Framblings.mcpher.com%2F&format=xml" /> 30<style id="wp-img-auto-sizes-contain-inline-css"> 31img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 32/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 33</style> 34 35 36<link rel='stylesheet' id='wpo_min-header-0-css' href='https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1790832964/assets/wpo-minify-header-c41c5587.min.css' media='all' />
37<script id="wpo_min-header-0-js" src="https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1790832964/assets/wpo-minify-header-617f1deb.min.js"></script>
37 38 39<!-- Google tag (gtag.js) snippet added by Site Kit --> 40<!-- Google Analytics snippet added by Site Kit -->
vendor: 80 bytes, lines 40-41
40 41<script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
41GT-PZMQBJ3
vendor: 18 bytes, line 41
41" async></script>
42<script id="google_gtagjs-js-after"> 43window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);} 44gtag("set","linker",{"domains":["ramblings.mcpher.com"]}); 45gtag("js", new Date()); 46gtag("set", "developer_id.dZTNiMT", true); 47gtag("config", "GT-PZMQBJ3"); 48//# sourceURL=google_gtagjs-js-after 49</script>
49 50<link rel="https://api.w.org/" href="https://ramblings.mcpher.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://ramblings.mcpher.com/wp-json/wp/v2/pages/15995" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://ramblings.mcpher.com/xmlrpc.php?rsd" /> 51<meta name="generator" content="WordPress 7.1.2" /> 52<link rel='shortlink' href='https://ramblings.mcpher.com/' /> 53<meta name="generator" content="Site Kit by Google 1.188.0" />
53<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0073976545556837" 54 crossorigin="anonymous"></script>
54 55 56
57<script async src="https://fundingchoicesmessages.google.com/i/pub-0073976545556837?ers=1" nonce="LLy8N0DUptDCBEvhFuwJ1g"></script>
57<script nonce="LLy8N0DUptDCBEvhFuwJ1g">(function() {function signalGooglefcPresent() {if (!window.frames['googlefcPresent']) {if (document.body) {const iframe = document.createElement('iframe'); iframe.style = 'width: 0; height: 0; border: none; z-index: -1000; left: -1000px; top: -1000px;'; iframe.style.display = 'none'; iframe.name = 'googlefcPresent'; document.body.appendChild(iframe);} else {setTimeout(signalGooglefcPresent, 0);}}}signalGooglefcPresent();})();</script>
57 58 59 60 61<style type="text/css"> 62.mh-navigation li:hover, .mh-navigation ul li:hover > ul, .mh-main-nav-wrap, .mh-main-nav, .mh-social-nav li a:hover, .entry-tags li, .mh-slider-caption, .mh-widget-layout8 .mh-widget-title .mh-footer-widget-title-inner, .mh-widget-col-1 .mh-slider-caption, .mh-widget-col-1 .mh-posts-lineup-caption, .mh-carousel-layout1, .mh-spotlight-widget, .mh-social-widget li a, .mh-author-bio-widget, .mh-footer-widget .mh-tab-comment-excerpt, .mh-nip-item:hover .mh-nip-overlay, .mh-widget .tagcloud a, .mh-footer-widget .tagcloud a, .mh-footer, .mh-copyright-wrap, input[type=submit]:hover, #infinite-handle span:hover { background: #f55951; } 63.mh-extra-nav-bg { background: rgba(245, 89, 81, 0.2); } 64.mh-slider-caption, .mh-posts-stacked-title, .mh-posts-lineup-caption { background: #f55951; background: rgba(245, 89, 81, 0.8); } 65@media screen and (max-width: 900px) { #mh-mobile .mh-slider-caption, #mh-mobile .mh-posts-lineup-caption { background: rgba(245, 89, 81, 1); } } 66.slicknav_menu, .slicknav_nav ul, #mh-mobile .mh-footer-widget .mh-posts-stacked-overlay { border-color: #f55951; } 67.mh-copyright, .mh-copyright a { color: #fff; } 68.mh-widget-layout4 .mh-widget-title { background: #edd2cb; background: rgba(237, 210, 203, 0.6); } 69.mh-preheader, .mh-wide-layout .mh-subheader, .mh-ticker-title, .mh-main-nav li:hover, .mh-footer-nav, .slicknav_menu, .slicknav_btn, .slicknav_nav .slicknav_item:hover, .slicknav_nav a:hover, .mh-back-to-top, .mh-subheading, .entry-tags .fa, .entry-tags li:hover, .mh-widget-layout2 .mh-widget-title, .mh-widget-layout4 .mh-widget-title-inner, .mh-widget-layout4 .mh-footer-widget-title, .mh-widget-layout5 .mh-widget-title-inner, .mh-widget-layout6 .mh-widget-title, #mh-mobile .flex-control-paging li a.flex-active, .mh-image-caption, .mh-carousel-layout1 .mh-carousel-caption, .mh-tab-button.active, .mh-tab-button.active:hover, .mh-footer-widget .mh-tab-button.active, .mh-social-widget li:hover a, .mh-footer-widget .mh-social-widget li a, .mh-footer-widget .mh-author-bio-widget, .tagcloud a:hover, .mh-widget .tagcloud a:hover, .mh-footer-widget .tagcloud a:hover, .mh-posts-stacked-item .mh-meta, .page-numbers:hover, .mh-loop-pagination .current, .mh-comments-pagination .current, .pagelink, a:hover .pagelink, input[type=submit], #infinite-handle span { background: #edd2cb; } 70.mh-main-nav-wrap .slicknav_nav ul, blockquote, .mh-widget-layout1 .mh-widget-title, .mh-widget-layout3 .mh-widget-title, .mh-widget-layout5 .mh-widget-title, .mh-widget-layout8 .mh-widget-title:after, #mh-mobile .mh-slider-caption, .mh-carousel-layout1, .mh-spotlight-widget, .mh-author-bio-widget, .mh-author-bio-title, .mh-author-bio-image-frame, .mh-video-widget, .mh-tab-buttons, textarea:hover, input[type=text]:hover, input[type=email]:hover, input[type=tel]:hover, input[type=url]:hover { border-color: #edd2cb; } 71.mh-header-tagline, .mh-dropcap, .mh-carousel-layout1 .flex-direction-nav a, .mh-carousel-layout2 .mh-carousel-caption, .mh-posts-digest-small-category, .mh-posts-lineup-more, .bypostauthor .fn:after, .mh-comment-list .comment-reply-link:before, #respond #cancel-comment-reply-link:before { color: #edd2cb; } 72body, a, blockquote, blockquote cite, .post .entry-title, .page-title, .entry-content h1, .entry-content h2, .entry-content h3, .entry-content h4, .entry-content h5, .entry-content h6, .wp-caption-text, .wp-block-image figcaption, .wp-block-audio figcaption, #respond .comment-reply-title, #respond #cancel-comment-reply-link, #respond .logged-in-as a, .mh-ping-list .mh-ping-item a, .mh-widget-layout1 .mh-widget-title, .mh-widget-layout7 .mh-widget-title, .mh-widget-layout8 .mh-widget-title, .mh-slider-layout4 .mh-slider-caption, .mh-slider-layout4 .mh-slider-caption a, .mh-slider-layout4 .mh-slider-caption a:hover { color: #2a2a2a; } 73.mh-header-nav-bottom li a, .mh-social-nav-bottom .fa-mh-social, .mh-boxed-layout .mh-ticker-item-bottom a, .mh-header-date-bottom, .page-numbers, a .pagelink, .mh-widget-layout3 .mh-widget-title, .mh-widget-layout3 .mh-widget-title a, .mh-tabbed-widget, .mh-tabbed-widget a, .mh-posts-horizontal-title a { color: #543c52; } 74.entry-content a { color: #1e73be; } 75</style> 76<!--[if lt IE 9]>
77<script src="https://ramblings.mcpher.com/wp-content/themes/mh-magazine/js/css3-mediaqueries.js"></script>
77 78<![endif]--> 79<style type="text/css"> 80.entry-content { font-size: 15px; font-size: 0.9375rem; } 81h1, h2, h3, h4, h5, h6, .mh-custom-posts-small-title { font-family: "Roboto"; } 82body { font-family: "Roboto"; } 83</style> 84 85<!-- Google AdSense meta tags added by Site Kit --> 86<meta name="google-adsense-platform-account" content="ca-host-pub-2644536267352236"> 87<meta name="google-adsense-platform-domain" content="sitekit.withgoogle.com"> 88<!-- End Google AdSense meta tags added by Site Kit --> 89 90<!-- Google AdSense snippet added by Site Kit -->
91<script async crossorigin="anonymous" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0073976545556837&host=ca-host-pub-2644536267352236"></script>
91 92 93<!-- End Google AdSense snippet added by Site Kit --> 94 95<!-- Google AdSense Ad Blocking Recovery snippet added by Site Kit -->
96<script async src="https://fundingchoicesmessages.google.com/i/pub-0073976545556837?ers=1" nonce="4EDLURXSpru1kSuw6JW75A"></script>
96<script nonce="4EDLURXSpru1kSuw6JW75A">(function() {function signalGooglefcPresent() {if (!window.frames['googlefcPresent']) {if (document.body) {const iframe = document.createElement('iframe'); iframe.style = 'width: 0; height: 0; border: none; z-index: -1000; left: -1000px; top: -1000px;'; iframe.style.display = 'none'; iframe.name = 'googlefcPresent'; document.body.appendChild(iframe);} else {setTimeout(signalGooglefcPresent, 0);}}}signalGooglefcPresent();})();</script>
96 97<!-- End Google AdSense Ad Blocking Recovery snippet added by Site Kit --> 98 99<!-- Google AdSense Ad Blocking Recovery Error Protection snippet added by Site Kit -->
100<script>(function(){'use strict';function aa(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; 101function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var da=ca(this);function k(a,b){if(b)a:{var c=da;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&ba(c,a,{configurable:!0,writable:!0,value:b})}} 102function ea(a){return a.raw=a}function m(a){var b="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];if(b)return b.call(a);if("number"==typeof a.length)return{next:aa(a)};throw Error(String(a)+" is not an iterable or ArrayLike");}function fa(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}var ha="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},n; 103if("function"==typeof Object.setPrototypeOf)n=Object.setPrototypeOf;else{var q;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;q=ja.a;break a}catch(a){}q=!1}n=q?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=n; 104function r(a,b){a.prototype=ha(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.A=b.prototype}function la(){for(var a=Number(this),b=[],c=a;c<arguments.length;c++)b[c-a]=arguments[c];return b}k("Number.MAX_SAFE_INTEGER",function(){return 9007199254740991}); 105k("Number.isFinite",function(a){return a?a:function(b){return"number"!==typeof b?!1:!isNaN(b)&&Infinity!==b&&-Infinity!==b}});k("Number.isInteger",function(a){return a?a:function(b){return Number.isFinite(b)?b===Math.floor(b):!1}});k("Number.isSafeInteger",function(a){return a?a:function(b){return Number.isInteger(b)&&Math.abs(b)<=Number.MAX_SAFE_INTEGER}}); 106k("Math.trunc",function(a){return a?a:function(b){b=Number(b);if(isNaN(b)||Infinity===b||-Infinity===b||0===b)return b;var c=Math.floor(Math.abs(b));return 0>b?-c:c}});k("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});k("Array.prototype.includes",function(a){return a?a:function(b,c){var d=this;d instanceof String&&(d=String(d));var e=d.length;c=c||0;for(0>c&&(c=Math.max(c+e,0));c<e;c++){var f=d[c];if(f===b||Object.is(f,b))return!0}return!1}}); 107k("String.prototype.includes",function(a){return a?a:function(b,c){if(null==this)throw new TypeError("The 'this' value for String.prototype.includes must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype.includes must not be a regular expression");return-1!==this.indexOf(b,c||0)}});/* 108 109 Copyright The Closure Library Authors. 110 SPDX-License-Identifier: Apache-2.0 111*/ 112var t=this||self;function v(a){return a};var w,x;a:{for(var ma=["CLOSURE_FLAGS"],y=t,z=0;z<ma.length;z++)if(y=y[ma[z]],null==y){x=null;break a}x=y}var na=x&&x[610401301];w=null!=na?na:!1;var A,oa=t.navigator;A=oa?oa.userAgentData||null:null;function B(a){return w?A?A.brands.some(function(b){return(b=b.brand)&&-1!=b.indexOf(a)}):!1:!1}function C(a){var b;a:{if(b=t.navigator)if(b=b.userAgent)break a;b=""}return-1!=b.indexOf(a)};function D(){return w?!!A&&0<A.brands.length:!1}function E(){return D()?B("Chromium"):(C("Chrome")||C("CriOS"))&&!(D()?0:C("Edge"))||C("Silk")};var pa=D()?!1:C("Trident")||C("MSIE");!C("Android")||E();E();C("Safari")&&(E()||(D()?0:C("Coast"))||(D()?0:C("Opera"))||(D()?0:C("Edge"))||(D()?B("Microsoft Edge"):C("Edg/"))||D()&&B("Opera"));var qa={},F=null;var ra="undefined"!==typeof Uint8Array,sa=!pa&&"function"===typeof btoa;function G(){return"function"===typeof BigInt};var H=0,I=0;function ta(a){var b=0>a;a=Math.abs(a);var c=a>>>0;a=Math.floor((a-c)/4294967296);b&&(c=m(ua(c,a)),b=c.next().value,a=c.next().value,c=b);H=c>>>0;I=a>>>0}function va(a,b){b>>>=0;a>>>=0;if(2097151>=b)var c=""+(4294967296*b+a);else G()?c=""+(BigInt(b)<<BigInt(32)|BigInt(a)):(c=(a>>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+6777216*c+6710656*b,c+=8147497*b,b*=2,1E7<=a&&(c+=Math.floor(a/1E7),a%=1E7),1E7<=c&&(b+=Math.floor(c/1E7),c%=1E7),c=b+wa(c)+wa(a)
112);return c} 113function wa(a){a=String(a);return"0000000".slice(a.length)+a}function ua(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var J;J="function"===typeof Symbol&&"symbol"===typeof Symbol()?Symbol():void 0;var xa=J?function(a,b){a[J]|=b}:function(a,b){void 0!==a.g?a.g|=b:Object.defineProperties(a,{g:{value:b,configurable:!0,writable:!0,enumerable:!1}})},K=J?function(a){return a[J]|0}:function(a){return a.g|0},L=J?function(a){return a[J]}:function(a){return a.g},M=J?function(a,b){a[J]=b;return a}:function(a,b){void 0!==a.g?a.g=b:Object.defineProperties(a,{g:{value:b,configurable:!0,writable:!0,enumerable:!1}});return a};function ya(a,b){M(b,(a|0)&-14591)}function za(a,b){M(b,(a|34)&-14557)} 114function Aa(a){a=a>>14&1023;return 0===a?536870912:a};var N={},Ba={};function Ca(a){return!(!a||"object"!==typeof a||a.g!==Ba)}function Da(a){return null!==a&&"object"===typeof a&&!Array.isArray(a)&&a.constructor===Object}function P(a,b,c){if(!Array.isArray(a)||a.length)return!1;var d=K(a);if(d&1)return!0;if(!(b&&(Array.isArray(b)?b.includes(c):b.has(c))))return!1;M(a,d|1);return!0}Object.freeze(new function(){});Object.freeze(new function(){});var Ea=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/;var Q;function Fa(a,b){Q=b;a=new a(b);Q=void 0;return a} 115function R(a,b,c){null==a&&(a=Q);Q=void 0;if(null==a){var d=96;c?(a=[c],d|=512):a=[];b&&(d=d&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error();d=K(a);if(d&64)return a;d|=64;if(c&&(d|=512,c!==a[0]))throw Error();a:{c=a;var e=c.length;if(e){var f=e-1;if(Da(c[f])){d|=256;b=f-(+!!(d&512)-1);if(1024<=b)throw Error();d=d&-16760833|(b&1023)<<14;break a}}if(b){b=Math.max(b,e-(+!!(d&512)-1));if(1024<b)throw Error();d=d&-16760833|(b&1023)<<14}}}M(a,d);return a};function Ga(a){switch(typeof a){case "number":return isFinite(a)?a:String(a);case "boolean":return a?1:0;case "object":if(a)if(Array.isArray(a)){if(P(a,void 0,0))return}else if(ra&&null!=a&&a instanceof Uint8Array){if(sa){for(var b="",c=0,d=a.length-10240;c<d;)b+=String.fromCharCode.apply(null,a.subarray(c,c+=10240));b+=String.fromCharCode.apply(null,c?a.subarray(c):a);a=btoa(b)}else{void 0===b&&(b=0);if(!F){F={};c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split("");d=["+/=", 116"+/","-_=","-_.","-_"];for(var e=0;5>e;e++){var f=c.concat(d[e].split(""));qa[e]=f;for(var g=0;g<f.length;g++){var h=f[g];void 0===F[h]&&(F[h]=g)}}}b=qa[b];c=Array(Math.floor(a.length/3));d=b[64]||"";for(e=f=0;f<a.length-2;f+=3){var l=a[f],p=a[f+1];h=a[f+2];g=b[l>>2];l=b[(l&3)<<4|p>>4];p=b[(p&15)<<2|h>>6];h=b[h&63];c[e++]=g+l+p+h}g=0;h=d;switch(a.length-f){case 2:g=a[f+1],h=b[(g&15)<<2]||d;case 1:a=a[f],c[e]=b[a>>2]+b[(a&3)<<4|g>>4]+h+d}a=c.join("")}return a}}return a};function Ha(a,b,c){a=Array.prototype.slice.call(a);var d=a.length,e=b&256?a[d-1]:void 0;d+=e?-1:0;for(b=b&512?1:0;b<d;b++)a[b]=c(a[b]);if(e){b=a[b]={};for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&(b[f]=c(e[f]))}return a}function Ia(a,b,c,d,e){if(null!=a){if(Array.isArray(a))a=P(a,void 0,0)?void 0:e&&K(a)&2?a:Ja(a,b,c,void 0!==d,e);else if(Da(a)){var f={},g;for(g in a)Object.prototype.hasOwnProperty.call(a,g)&&(f[g]=Ia(a[g],b,c,d,e));a=f}else a=b(a,d);return a}} 117function Ja(a,b,c,d,e){var f=d||c?K(a):0;d=d?!!(f&32):void 0;a=Array.prototype.slice.call(a);for(var g=0;g<a.length;g++)a[g]=Ia(a[g],b,c,d,e);c&&c(f,a);return a}function Ka(a){return a.s===N?a.toJSON():Ga(a)};function La(a,b,c){c=void 0===c?za:c;if(null!=a){if(ra&&a instanceof Uint8Array)return b?a:new Uint8Array(a);if(Array.isArray(a)){var d=K(a);if(d&2)return a;b&&(b=0===d||!!(d&32)&&!(d&64||!(d&16)));return b?M(a,(d|34)&-12293):Ja(a,La,d&4?za:c,!0,!0)}a.s===N&&(c=a.h,d=L(c),a=d&2?a:Fa(a.constructor,Ma(c,d,!0)));return a}}function Ma(a,b,c){var d=c||b&2?za:ya,e=!!(b&32);a=Ha(a,b,function(f){return La(f,e,d)});xa(a,32|(c?2:0));return a};function Na(a,b){a=a.h;return Oa(a,L(a),b)}function Oa(a,b,c,d){if(-1===c)return null;if(c>=Aa(b)){if(b&256)return a[a.length-1][c]}else{var e=a.length;
117if(d&&b&256&&(d=a[e-1][c],null!=d))return d;b=c+(+!!(b&512)-1);if(b<e)return a[b]}}function Pa(a,b,c,d,e){var f=Aa(b);if(c>=f||e){var g=b;if(b&256)e=a[a.length-1];else{if(null==d)return;e=a[f+(+!!(b&512)-1)]={};g|=256}e[c]=d;c<f&&(a[c+(+!!(b&512)-1)]=void 0);g!==b&&M(a,g)}else a[c+(+!!(b&512)-1)]=d,b&256&&(a=a[a.length-1],c in a&&delete a[c])} 118function Qa(a,b){var c=Ra;var d=void 0===d?!1:d;var e=a.h;var f=L(e),g=Oa(e,f,b,d);if(null!=g&&"object"===typeof g&&g.s===N)c=g;else if(Array.isArray(g)){var h=K(g),l=h;0===l&&(l|=f&32);l|=f&2;l!==h&&M(g,l);c=new c(g)}else c=void 0;c!==g&&null!=c&&Pa(e,f,b,c,d);e=c;if(null==e)return e;a=a.h;f=L(a);f&2||(g=e,c=g.h,h=L(c),g=h&2?Fa(g.constructor,Ma(c,h,!1)):g,g!==e&&(e=g,Pa(a,f,b,e,d)));return e}function Sa(a,b){a=Na(a,b);return null==a||"string"===typeof a?a:void 0} 119function Ta(a,b){var c=void 0===c?0:c;a=Na(a,b);if(null!=a)if(b=typeof a,"number"===b?Number.isFinite(a):"string"!==b?0:Ea.test(a))if("number"===typeof a){if(a=Math.trunc(a),!Number.isSafeInteger(a)){ta(a);b=H;var d=I;if(a=d&2147483648)b=~b+1>>>0,d=~d>>>0,0==b&&(d=d+1>>>0);b=4294967296*d+(b>>>0);a=a?-b:b}}else if(b=Math.trunc(Number(a)),Number.isSafeInteger(b))a=String(b);else{if(b=a.indexOf("."),-1!==b&&(a=a.substring(0,b)),!("-"===a[0]?20>a.length||20===a.length&&-922337<Number(a.substring(0,7)): 12019>a.length||19===a.length&&922337>Number(a.substring(0,6)))){if(16>a.length)ta(Number(a));else if(G())a=BigInt(a),H=Number(a&BigInt(4294967295))>>>0,I=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+("-"===a[0]);I=H=0;d=a.length;for(var e=b,f=(d-b)%6+b;f<=d;e=f,f+=6)e=Number(a.slice(e,f)),I*=1E6,H=1E6*H+e,4294967296<=H&&(I+=Math.trunc(H/4294967296),I>>>=0,H>>>=0);b&&(b=m(ua(H,I)),a=b.next().value,b=b.next().value,H=a,I=b)}a=H;b=I;b&2147483648?G()?a=""+(BigInt(b|0)<<BigInt(32)|BigInt(a>>>0)):(b= 121m(ua(a,b)),a=b.next().value,b=b.next().value,a="-"+va(a,b)):a=va(a,b)}}else a=void 0;return null!=a?a:c}function S(a,b){a=Sa(a,b);return null!=a?a:""};function T(a,b,c){this.h=R(a,b,c)}T.prototype.toJSON=function(){return Ua(this,Ja(this.h,Ka,void 0,void 0,!1),!0)};T.prototype.s=N;T.prototype.toString=function(){return Ua(this,this.h,!1).toString()}; 122function Ua(a,b,c){var d=a.constructor.v,e=L(c?a.h:b);a=b.length;if(!a)return b;var f;if(Da(c=b[a-1])){a:{var g=c;var h={},l=!1,p;for(p in g)if(Object.prototype.hasOwnProperty.call(g,p)){var u=g[p];if(Array.isArray(u)){var jb=u;if(P(u,d,+p)||Ca(u)&&0===u.size)u=null;u!=jb&&(l=!0)}null!=u?h[p]=u:l=!0}if(l){for(var O in h){g=h;break a}g=null}}g!=c&&(f=!0);a--}for(p=+!!(e&512)-1;0<a;a--){O=a-1;c=b[O];O-=p;if(!(null==c||P(c,d,O)||Ca(c)&&0===c.size))break;var kb=!0}if(!f&&!kb)return b;b=Array.prototype.slice.call(b, 1230,a);g&&b.push(g);return b};function Va(a){return function(b){if(null==b||""==b)b=new a;else{b=JSON.parse(b);if(!Array.isArray(b))throw Error(void 0);xa(b,32);b=Fa(a,b)}return b}};function Wa(a){this.h=R(a)}r(Wa,T);var Xa=Va(Wa);var U;function V(a){this.g=a}V.prototype.toString=function(){return this.g+""};var Ya={};function Za(a){if(void 0===U){var b=null;var c=t.trustedTypes;if(c&&c.createPolicy){try{b=c.createPolicy("goog#html",{createHTML:v,createScript:v,createScriptURL:v})}catch(d){t.console&&t.console.error(d.message)}U=b}else U=b}a=(b=U)?b.createScriptURL(a):a;return new V(a,Ya)};function $a(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)};function ab(a,b){b=String(b);"application/xhtml+xml"===a.contentType&&(b=b.toLowerCase());return a.createElement(b)}function bb(a){this.g=a||t.document||document};/* 124 125 SPDX-License-Identifier: Apache-2.0 126*/ 127function cb(a,b){a.src=b instanceof V&&b.constructor===V?b.g:"type_error:TrustedResourceUrl";var c,d;(c=(b=null==(d=(c=(a.ownerDocument&&a.ownerDocument.defaultView||window).document).querySelector)?void 0:d.call(c,"script[nonce]"))?b.nonce||b.getAttribute("nonce")||"":"")&&a.setAttribute("nonce",c)};function db(a){a=void 0===a?document:a;return a.createElement("script")};function eb(a,b,c,d,e,f){try{var g=a.g,h=db(g);h.async=!0;cb(h,b);g.head.appendChild(h);h.addEventListener("load",function(){e();d&&g.head.removeChild(h)});h.addEventListener("error",function(){0<c?eb(a,b,c-1,d,e,f):(d&&g.head.removeChild(h),f())})}catch(l){f()}};var fb=t.atob("aHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vaW1hZ2VzL2ljb25zL21hdGVyaWFsL3N5c3RlbS8xeC93YXJuaW5nX2FtYmVyXzI0ZHAucG5n"),gb=t.atob("WW91IGFyZSBzZWVpbmcgdGhpcyBtZXNzYWdlIGJlY2F1c2UgYWQgb3Igc2NyaXB0IGJsb2NraW5nIHNvZnR3YXJlIGlzIGludGVyZmVyaW5nIHdpdGggdGhpcyBwYWdlLg=="),hb=t.atob("RGlzYWJsZSBhbnkgYWQgb3Igc2NyaXB0IGJsb2NraW5nIHNvZnR3YXJlLCB0aGVuIHJlbG9hZCB0aGlzIHBhZ2Uu");function ib(a,b,c){this.i=a;this.u=b;this.o=c;this.g=null;this.j=[];this.m=!1;this.l=new bb(this.i)} 128function lb(a){if(a.i.body&&!a.m){var b=function(){mb(a);t.setTimeout(function(){nb(a,3)},50)};eb(a.l,a.u,2,!0,function(){t[a.o]||b()},b);a.m=!0}} 129function mb(a){for(var b=W(1,5),c=0;c<b;c++){var d=X(a);a.i.body.appendChild(d);a.j.push(d)}b=X(a);b.style.bottom="0";b.style.left="0";b.style.position="fixed";b.style.width=W(100,110).toString()+"%";b.style.zIndex=W(2147483544,2147483644).toString();b.style.backgroundColor=ob(249,259,242,252,219,229);b.style.boxShadow="0 0 12px #888";b.style.color=ob(0,10,0,10,0,10);b.style.display="flex";b.style.justifyContent="center";b.style.fontFamily="Roboto, Arial";c=X(a);c.style.width=W(80,85).toString()+ 130"%";c.style.maxWidth=W(750,775).toString()+"px";c.style.margin="24px";c.style.display="flex";c.style.alignItems="flex-start";c.style.justifyContent="center";d=ab(a.l.g,"IMG");d.className=$a();d.src=fb;d.alt="Warning icon";d.style.height="24px";d.style.width="24px";d.style.paddingRight="16px";var e=X(a),f=X(a);f.style.fontWeight="bold";f.textContent=gb;var g=X(a);g.textContent=hb;Y(a,e,f);Y(a,e,g);Y(a,c,d);Y(a,c,e);Y(a,b,c);a.g=b;a.i.body.appendChild(a.g);b=W(1,5);for(c=0;c<b;c++)d=X(a),a.i.body.appendChild(d), 131a.j.push(d)}function Y(a,b,c){for(var d=W(1,5),e=0;e<d;e++){var f=X(a);b.appendChild(f)}b.appendChild(c);c=W(1,5);for(d=0;d<c;d++)e=X(a),b.appendChild(e)}function W(a,b){return Math.floor(a+Math.random()*(b-a))}function ob(a,b,c,d,e,f){return"rgb("+W(Math.max(a,0),Math.min(b,255)).toString()+","+W(Math.max(c,0),Math.min(d,255)).toString()+","+W(Math.max(e,0),Math.min(f,255)).toString()+")"}function X(a){a=ab(a.l.g,"DIV");a.className=$a();return a} 132function nb(a,b){0>=b||null!=a.g&&0!==a.g.offsetHeight&&0!==a.g.offsetWidth||(pb(a),mb(a),t.setTimeout(function(){nb(a,b-1)},50))}function pb(a){for(var b=m(a.j),c=b.next();!c.done;c=b.next())(c=c.value)&&c.parentNode&&c.parentNode.removeChild(c);a.j=[];(b=a.g)&&b.parentNode&&b.parentNode.removeChild(b);a.g=null};function qb(a,b,c,d,e){function f(l){document.body?g(document.body):0<l?t.setTimeout(function(){f(l-1)},e):b()}function g(l){l.appendChild(h);t.setTimeout(function(){h?(0!==h.offsetHeight&&0!==h.offsetWidth?b():a(),h.parentNode&&h.parentNode.removeChild(h)):a()},d)}var h=rb(c);f(3)}function rb(a){var b=document.createElement("div");b.className=a;b.style.width="1px";b.style.height="1px";b.style.position="absolute";b.style.left="-10000px";b.style.top="-10000px";b.style.zIndex="-10000";return b};function Ra(a){this.h=R(a)}r(Ra,T);
132function sb(a){this.h=R(a)}r(sb,T);var tb=Va(sb);function ub(a){var b=la.apply(1,arguments);if(0===b.length)return Za(a[0]);for(var c=a[0],d=0;d<b.length;d++)c+=encodeURIComponent(b[d])+a[d+1];return Za(c)};function vb(a){if(!a)return null;a=Sa(a,4);var b;null===a||void 0===a?b=null:b=Za(a);return b};var wb=ea([""]),xb=ea([""]);function yb(a,b){this.m=a;this.o=new bb(a.document);this.g=b;this.j=S(this.g,1);this.u=vb(Qa(this.g,2))||ub(wb);this.i=!1;b=vb(Qa(this.g,13))||ub(xb);this.l=new ib(a.document,b,S(this.g,12))}yb.prototype.start=function(){zb(this)}; 133function zb(a){Ab(a);eb(a.o,a.u,3,!1,function(){a:{var b=a.j;var c=t.btoa(b);if(c=t[c]){try{var d=Xa(t.atob(c))}catch(e){b=!1;break a}b=b===Sa(d,1)}else b=!1}b?Z(a,S(a.g,14)):(Z(a,S(a.g,8)),lb(a.l))},function(){qb(function(){Z(a,S(a.g,7));lb(a.l)},function(){return Z(a,S(a.g,6))},S(a.g,9),Ta(a.g,10),Ta(a.g,11))})}function Z(a,b){a.i||(a.i=!0,a=new a.m.XMLHttpRequest,a.open("GET",b,!0),a.send())}function Ab(a){var b=t.btoa(a.j);a.m[b]&&Z(a,S(a.g,5))};(function(a,b){t[a]=function(){var c=la.apply(0,arguments);t[a]=function(){};b.call.apply(b,[null].concat(c instanceof Array?c:fa(m(c))))}})("__h82AlnkH6D91__",function(a){"function"===typeof window.atob&&(new yb(window,tb(window.atob(a)))).start()});}).call(this); 134 135window.__h82AlnkH6D91__("WyJwdWItMDA3Mzk3NjU0NTU1NjgzNyIsW251bGwsbnVsbCxudWxsLCJodHRwczovL2Z1bmRpbmdjaG9pY2VzbWVzc2FnZXMuZ29vZ2xlLmNvbS9iL3B1Yi0wMDczOTc2NTQ1NTU2ODM3Il0sbnVsbCxudWxsLCJodHRwczovL2Z1bmRpbmdjaG9pY2VzbWVzc2FnZXMuZ29vZ2xlLmNvbS9lbC9BR1NLV3hVenhkN3lsbUlHNGE3MlM2TTRFZzlwVWt3OXNNZHRUYlVRWTBTZG9JZHQ0SHZBRDJLQlRXNU9PbHp6bHhGMDA3aFppalNNNDdxVjZlUHU1RW81bk9mMDB3XHUwMDNkXHUwMDNkP3RlXHUwMDNkVE9LRU5fRVhQT1NFRCIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFdIMlBHZWYyLV9wVnR1MG9JWUE3c2VOS0RsbS1FSC1nUnNZT2cyNnRsQ3JPQ21LZ3N0QUxQeDV1N2NxVmpGZEF2V1pKTEEyaWswMjNkV1N0cXdRaXdSdmdcdTAwM2RcdTAwM2Q/YWJcdTAwM2QxXHUwMDI2c2JmXHUwMDNkMSIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFZkbE96RVJ6T3F5MXo5R1pSeHNlT3YyLUFMSF93VWN6a0VseFBoWUYyRHgxYm55Uks4QV9nd0I5MlF2WFNnYXVBSEo5TlpITHBsVGZtQjFkZ1k1azN3N0FcdTAwM2RcdTAwM2Q/YWJcdTAwM2QyXHUwMDI2c2JmXHUwMDNkMSIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFZ2eFR2SHZtbVR6eTVualVfajB0RTB5RVZDZXFmS0VRVmNyUnp6M3A2c3c3REl5dDZRaVlQY2ZiVmJtRTJPWWZueFJlM3AxbU9TSVUxakktSzJ2TXBCYUFcdTAwM2RcdTAwM2Q/c2JmXHUwMDNkMiIsImRpdi1ncHQtYWQiLDIwLDEwMCwiY0hWaUxUQXdOek01TnpZMU5EVTFOVFk0TXpjXHUwMDNkIixbbnVsbCxudWxsLG51bGwsImh0dHBzOi8vd3d3LmdzdGF0aWMuY29tLzBlbW4vZi9wL3B1Yi0wMDczOTc2NTQ1NTU2ODM3LmpzP3VzcXBcdTAwM2RDQTAiXSwiaHR0cHM6Ly9mdW5kaW5nY2hvaWNlc21lc3NhZ2VzLmdvb2dsZS5jb20vZWwvQUdTS1d4WFp3dlFHOWkwMFdfWm5Hb0RocXRMVVZjanRHY1M5THNVNHBqUTdXMVo0Wl82eDN2TVFZdElQRU03ZnMzY0h1TkZJNEdZUGZLTnpDclBPMHk0dmFwbkNpZ1x1MDAzZFx1MDAzZCJd");</script>
135 136<!-- End Google AdSense Ad Blocking Recovery Error Protection snippet added by Site Kit --> 137<link rel="icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color-50x50.png" sizes="32x32" /> 138<link rel="icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" sizes="192x192" /> 139<link rel="apple-touch-icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" /> 140<meta name="msapplication-TileImage" content="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" /> 141<style id="wp-custom-css"> 142.bmc-btn-text { 143 144margin-left: 8px; 145display: inline-block; 146line-height: 0; 147width: 100%; 148flex-shrink: 0; 149color: white; 150font-weight: 300; 151} 152 153.bmc-btn { 154margin-left: 20%; 155} 156</style> 157<style id="wp-block-heading-inline-css"> 158h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg} 159/*# sourceURL=https://ramblings.mcpher.com/wp-includes/blocks/heading/style.min.css */ 160</style> 161<style id="wp-block-paragraph-inline-css"> 162.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} 163/*# sourceURL=https://ramblings.mcpher.com/wp-includes/blocks/paragraph/style.min.css */ 164</style> 165<link rel='stylesheet' id='wpo_min-footer-0-css' href='https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1790832964/assets/wpo-minify-footer-f6b71002.min.css' media='all' /> 166 167</head> 168<body id="mh-mobile" class="home wp-singular page-template page-template-template-homepage page-template-template-homepage-php page page-id-15995 wp-custom-logo wp-theme-mh-magazine mh-boxed-layout mh-right-sb mh-loop-layout1 mh-widget-layout1" itemscope="itemscope" itemtype="https://schema.org/WebPage"> 169<div class="mh-container mh-container-outer"> 170<div class="mh-header-nav-mobile clearfix"></div> 171 <div class="mh-preheader"> 172 <div class="mh-container mh-container-inner mh-row clearfix"> 173 <div class="mh-header-bar-content mh-header-bar-top-left mh-col-2-3 clearfix"> 174 </div> 175 <div class="mh-header-bar-content mh-header-bar-top-right mh-col-1-3 clearfix"> 176 <aside class="mh-header-search mh-header-search-top"> 177 <form role="search" method="get" class="search-form" action="https://ramblings.mcpher.com/"> 178 <label> 179 <span class="screen-reader-text">Search for:</span> 180 <input type="search" class="search-field" placeholder="Search …" value="" name="s" /> 181 </label> 182 <input type="submit" class="search-submit" value="Search" /> 183 </form> </aside> 184 </div> 185 </div> 186 </div> 187<header class="mh-header" itemscope="itemscope" itemtype="https://schema.org/WPHeader"> 188 <div class="mh-container mh-container-inner clearfix"> 189 <div class="mh-custom-header clearfix"> 190<div class="mh-header-columns mh-row clearfix"> 191<div class="mh-col-1-1 mh-site-identity"> 192<div class="mh-site-logo" role="banner" itemscope="itemscope" itemtype="https://schema.org/Brand"> 193<a href="https://ramblings.mcpher.com/" class="custom-logo-link" rel="home" aria-current="page"><img width="600" height="106" src="https://ramblings.mcpher.com/wp-content/uploads/2024/06/logo-no-background-e1718288110412.png" class="custom-logo" alt="Desktop liberation" decoding="async" fetchpriority="high" /></a><div class="mh-header-text"> 194<a class="mh-header-text-link" href="https://ramblings.mcpher.com/" title="Desktop liberation" rel="home"> 195<h1 class="mh-header-title">Desktop liberation</h1> 196<h2 class="mh-header-tagline">
196The definitive resource for Google Workspace and Cloud automation</h2> 197</a> 198</div> 199</div> 200</div> 201</div> 202</div> 203 </div> 204 <div class="mh-main-nav-wrap"> 205 <nav class="mh-navigation mh-main-nav mh-container mh-container-inner clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement"> 206 <div class="menu-main-menu-container"><ul id="menu-main-menu" class="menu"><li id="menu-item-2233" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-has-children menu-item-2233"><a href="https://ramblings.mcpher.com" aria-current="page">Home</a> 207<ul class="sub-menu"> 208 <li id="menu-item-2273" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2273"><a href="https://ramblings.mcpher.com/ramblings/about/">About Desktop Liberation</a></li> 209 <li id="menu-item-9161" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9161"><a href="https://ramblings.mcpher.com/reusing-code-from-this-site/">Reusing code from this site</a></li> 210 <li id="menu-item-17494" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-17494"><a href="https://docs.google.com/spreadsheets/d/1DlKpVVYCrCPNfRbGsz6N_K3oPTgdC9gQIKi0aNb42uI/edit#gid=0">My Public GAS Library</a></li> 211 <li id="menu-item-17967" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-17967"><a href="https://ramblings.mcpher.com/privacy-and-usage-policy/">Privacy and Usage Policy</a></li> 212</ul> 213</li> 214<li id="menu-item-9939" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-9939"><a href="https://ramblings.mcpher.com/blog/">Blog</a> 215<ul class="sub-menu"> 216 <li id="menu-item-21177" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21177"><a href="https://ramblings.mcpher.com/ramblings-blog/">Access all published posts</a></li> 217</ul> 218</li> 219<li id="menu-item-9160" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9160"><a href="https://ramblings.mcpher.com/download-complete-projects/downloads/">Downloads</a></li> 220<li id="menu-item-20307" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20307"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/">APIS</a> 221<ul class="sub-menu"> 222 <li id="menu-item-20319" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20319"><a href="https://ramblings.mcpher.com/category/google-api/">Google API</a> 223 <ul class="sub-menu"> 224 <li id="menu-item-20333" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20333"><a href="https://ramblings.mcpher.com/category/google-api/charts/">Slides</a></li> 225 <li id="menu-item-20329" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20329"><a href="https://ramblings.mcpher.com/category/google-api/chrome/">Chrome</a></li> 226 <li id="menu-item-20330" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20330"><a href="https://ramblings.mcpher.com/category/google-api/docs/">Docs</a></li> 227 <li id="menu-item-20327" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20327"><a href="https://ramblings.mcpher.com/category/google-api/drive/">Drive</a></li> 228 <li id="menu-item-20328" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20328"><a href="https://ramblings.mcpher.com/category/google-api/execution/">Execution</a></li> 229 <li id="menu-item-20320" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20320"><a href="https://ramblings.mcpher.com/category/google-api/knowledgegraph/">KnowledgeGraph</a></li> 230 <li id="menu-item-20332" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20332"><a href="https://ramblings.mcpher.com/category/google-api/people/">People</a></li> 231 <li id="menu-item-20331" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20331"><a href="https://ramblings.mcpher.com/category/google-api/sheet/">Sheets</a></li> 232 </ul> 233</li> 234 <li id="menu-item-20324" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20324"><a href="https://ramblings.mcpher.com/category/microsoft-api/">Microsoft API</a> 235 <ul class="sub-menu"> 236 <li id="menu-item-20325" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20325"><a href="https://ramblings.mcpher.com/category/microsoft-api/onedrive/">OneDrive</a></li> 237 </ul> 238</li> 239 <li id="menu-item-20308" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20308"><a href="https://ramblings.mcpher.com/category/rest-api/">REST</a></li> 240 <li id="menu-item-20317" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20317"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/video-intelligence/">Video Intelligence</a></li> 241 <li id="menu-item-20318" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20318"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/vimeo/">Vimeo</a></li> 242 <li id="menu-item-20316" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20316"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/vision-apis-and-techniques/">Vision</a></li> 243</ul> 244</li> 245<li id="menu-item-15354" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15354"><a href="https://ramblings.mcpher.com/category/appsjavascripts/">Apps Script & Java Script</a> 246<ul class="sub-menu"> 247 <li id="menu-item-20943" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20943"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/apps-script-v8/">Apps Script v8</a></li> 248 <li id="menu-item-20379" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20379"><a href="https://ramblings.mcpher.com/category/add-ons/">Add-ons</a></li> 249 <li id="menu-item-20944" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20944"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/javascript/">Javascript</a></li> 250 <li id="menu-item-20281" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20281"><a href="https://ramblings.mcpher.com/category/vbatogas/">From VBA to Google Apps Script</a></li> 251 <li id="menu-item-20380" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20380"><a href="https://ramblings.mcpher.com/category/officevba/javascript-api/">Office JavaScript API</a></li> 252 <li id="menu-item-15908" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-15908"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/">Snippets</a></li> 253</ul> 254</li> 255<li id="menu-item-15303" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15303"><a href="https://ramblings.mcpher.com/category/gcp/">Cloud Platform</a> 256<ul class="sub-menu"> 257 <li id="menu-item-20277" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20277"><a href="https://ramblings.mcpher.com/category/bigquery/">BigQuery</a></li> 258 <li id="menu-item-20344" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20344"><a href="https://ramblings.mcpher.com/category/gcp/cloud-functions/">Cloud Functions</a></li> 259 <li id="menu-item-20343" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20343"><a href="https://ramblings.mcpher.com/category/databases/firebase-databases/">Firebase</a></li> 260 <li id="menu-item-20276" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20276"><a href="https://ramblings.mcpher.com/category/kubernetes/">Kubernetes</a></li> 261 <li id="menu-item-20285" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20285"><a href="https://ramblings.mcpher.com/category/gcp/">Google Cloud Platform</a></li> 262 <li id="menu-item-20278" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20278"><a href="https://ramblings.mcpher.com/category/cloud/storage/">Google Cloud Storage</a></li> 263</ul> 264</li> 265<li id="menu-item-20288" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20288"><a href="https://ramblings.mcpher.com/category/databases/">Databases</a> 266<ul class="sub-menu"> 267 <li id="menu-item-20291" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20291"><a href="https://ramblings.mcpher.com/category/bigquery/">BigQuery</a></li> 268 <li id="menu-item-20295" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20295"><a href="https://ramblings.mcpher.com/category/databases/cockroach/">CockroachDB</a></li> 269 <li id="menu-item-20326" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20326"><a href="https://ramblings.mcpher.com/category/database-abstraction/">Database abstraction</a></li> 270 <li id="menu-item-20289" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20289"><a href="https://ramblings.mcpher.com/category/elastic/">Elastic</a></li> 271 <li id="menu-item-20342" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20342"><a href="https://ramblings.mcpher.com/category/databases/firebase-databases/">Firebase</a></li> 272 <li id="menu-item-20290" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20290"><a href="https://ramblings.mcpher.com/category/redisreactredux/graphql/">GraphQL</a></li> 273</ul> 274</li> 275<li id="menu-item-15307" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15307"><a href="https://ramblings.mcpher.com/category/officevba/">Office & VBA</a> 276<ul class="sub-menu"> 277 <li id="menu-item-20282" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20282"><a href="https://ramblings.mcpher.com/category/vbatogas/">From VBA to Google Apps Script</a></li> 278 <li id="menu-item-20283" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20283"><a href="https://ramblings.mcpher.com/category/officevba/optimization-officevba/">Optimization</a></li> 279</ul> 280</li> 281</ul></div> </nav> 282 </div> 283 <div class="mh-extra-nav-wrap"> 284 <div class="mh-extra-nav-bg"> 285 <nav class="mh-navigation mh-extra-nav mh-container mh-container-inner clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement"> 286 <div class="menu-categories-container"><ul id="menu-categories" class="menu"><li id="menu-item-24300" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24300"><a href="https://ramblings.mcpher.com/category/elastic/">Elastic</a></li> 287<li id="menu-item-24301" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24301"><a href="https://ramblings.mcpher.com/category/redisreactredux/">Full Stack</a></li> 288<li id="menu-item-24302" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24302"><a href="https://ramblings.mcpher.com/category/redisreactredux/graphql/">GraphQL</a></li> 289<li id="menu-item-24303" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24303"><a href="https://ramblings.mcpher.com/category/kubernetes/">Kubernetes</a></li> 290<li id="menu-item-24304" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24304"><a href="https://ramblings.mcpher.com/category/node-js/">Node.js</a></li> 291<li id="menu-item-24305" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24305"><a href="https://ramblings.mcpher.com/category/redisreactredux/redis/">Redis-Vue.JS</a></li> 292</ul></div> </nav> 293 </div> 294 </div> 295 </header> 296 <div class="mh-subheader"> 297 <div class="mh-container mh-container-inner mh-row clearfix"> 298 <div class="mh-header-bar-content mh-header-bar-bottom-right mh-col-1-3 clearfix"> 299 <nav class="mh-social-icons mh-social-nav mh-social-nav-bottom clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement"> 300 <div class="menu-social-container"><ul id="menu-social" class="menu"><li id="menu-item-24374" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24374"><a target="_blank" href="https://www.linkedin.com/in/brucemcpherson/" title="LimkedIn"><i class="fa fa-mh-social"></i><span class="screen-reader-text">LinkedIn</span></a></li> 301<li id="menu-item-24380" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24380"><a target="_blank" href="https://github.com/brucemcpherson/"><i class="fa fa-mh-social"></i><span class="screen-reader-text">Github</span></a></li> 302</ul></div> </nav> 303 </div> 304 </div> 305 </div> 306<div class="mh-wrapper mh-home clearfix"> 307 <div class="mh-main mh-home-main"> 308 <div id="custom_html-37" class="widget_text mh-widget mh-home-1 mh-home-wide widget_custom_html"><div class="textwidget custom-html-widget"><div class="entry-content clearfix"> 309 <h3 class="wp-block-heading" style="font-weight: 500">Desktop Liberation focuses on technical tutorials, open-source tools, and practical code snippets designed for developers working with cloud APIs, office productivity software, and web development and features <a href="https://ramblings.mcpher.com/workplace-1000/">well over 1,000 articles</a>. </h3><p> 310 311 A major theme is Google Apps Script (GAS) and Google Cloud, covering everything from beginner-friendly guides to advanced techniques like emulating GAS environments locally on Node.js, running serverless workloads on GitHub Actions, and managing OAuth2 authentication. </p><p> 312 313 Alongside Google-centric topics, the site offers extensive resources on cross-platform development, including transitioning legacy Excel VBA code to JavaScript, integrating Microsoft APIs (such as OneDrive and Office 365), and implementing modern web frameworks and database abstractions using tools like React, Redux, Node.js, GraphQL, Redis, and Firebase. </p><p> 314 315 Additionally, the content frequently explores emerging developer workflows, such as combining local and hosted LLMs for cost-effective AI automation, managing Kubernetes infrastru
315cture, and building custom developer utilities.</p><p> 316 317 318All code here is unprotected and <a href="http://creativecommons.org/licenses/by-sa/3.0/deed.en_US" rel="nofollow">free to re-use</a> 319 </p> 320 <h4> 321 Article accuracy checks 322 </h4> 323 <p> 324 Recent articles now contain a final AI generated accuracy check. This validates that the article content can be used with confidence, and also provides an AI summary of its key points. 325 </p> 326 <hl></hl> 327 <h3 class="wp-block-heading" style="font-weight: 500">To support my site, and if you find the material useful, you can buy my Google Apps Script and VBA titles published by O'Reilly media and Manning publications.</h3> 328 <hl></hl> 329 <h3 class="wp-block-heading" style="font-weight: 500">I maintain hundreds of <a href="https://github.com/brucemcpherson">github repositories</a> with much of the code referenced on this site and elsewhere. If you find any of it useful, consider sponsoring my open source work.</h3> 330 <iframe src="https://github.com/sponsors/brucemcpherson/card" title="Sponsor brucemcpherson" height="100" width="600" style="border: 0;"></iframe> 331</div></div></div> <div class="mh-home-columns clearfix"> 332 <div id="main-content" class="mh-content mh-home-content"> 333 <div id="custom_html-38" class="widget_text mh-widget mh-home-2 mh-widget-col-2 widget_custom_html"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Most Recent Articles</span></h4><div class="textwidget custom-html-widget"><div class="pt-cv-wrapper"><div class="pt-cv-view pt-cv-onebig iscvblock iscvhybrid above-others onebig1 layout2 cveffect-darken pt-cv-left pt-cv-round-share" id="pt-cv-view-da5aca2ke1"><div data-id="pt-cv-page-1" class="pt-cv-page" data-cvc="1"><div class=" pt-cv-content-item pt-cv-2-col cv-main-post" data-pid="26214"><div class="pt-cv-thumb-wrapper "><a href="https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-default cvplbd cvp-lazy-container" target="_blank" ><img width="300" height="167" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded skip-lazy cvplazy" alt="bigquery gas-fakes" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-4-300x167.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-4-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-4-768x429.png 768w" /></a></div> 334<h4 class="pt-cv-title"><a href="https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/" class="_blank cvplbd" target="_blank" >Google Apps Script with BigQuery and gas-fakes</a></h4> 335<div class="pt-cv-content">This article explores how gas-fakes transforms Google Apps Script (GAS) into a high-performance development platform by enabling native execution on Node, effectively bypassing the platform's standard six-minute execution limits. It specifically highlights the native integration of BigQuery, allowing developers to query massive datasetsâsuch as the Gassypedia community databaseâdirectly from a local environment using familiar GAS syntax. Additionally, the piece demonstrates how AI agents can leverage these integrations to automate complex Workspace tasks through natural language prompts creating a scalable "lingua franca" for multi-cloud automation ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div> 336<div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/&text=Google+Apps+Script+with+BigQuery+and+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/google-apps-script-with-bigquery-and-gas-fakes/&title=Google+Apps+Script+with+BigQuery+and+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div> 337<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26167"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gassypedia-august-2026/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="infographic" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-1-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-1-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/07/image-1-300x167.png 300w" /></a></div> 338<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gassypedia-august-2026/" class="_blank cvplbd" target="_blank" >
338Gassypedia Update: The State of Public Apps Script (August 2026)</a></h4><div class="pt-cv-content">The Google Apps Script community is undergoing a remarkable expansion, effectively doubling its reach in just two years to become a thriving pillar of the GitHub landscape . By analyzing millions of repositories and well over a billion files, researchers have uncovered a massive ecosystem that now supports more than ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gassypedia-august-2026/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gassypedia-august-2026/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gassypedia-august-2026/&text=Gassypedia+Update%3A+The+State+of+Public+Apps+Script+%28August+2026%29" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gassypedia-august-2026/&title=Gassypedia+Update%3A+The+State+of+Public+Apps+Script+%28August+2026%29&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 339<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26157"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/kube-to-mig/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="vm self healing" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-3-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-3-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-3-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-3-1536x857.png 1536w" /></a></div> 340<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/kube-to-mig/" class="_blank cvplbd" target="_blank" >From Kubernetes to a Self-Healing, Low-Cost Infrastructure</a></h4><div class="pt-cv-content">I've been running a background project on Kubernetes for a while now. It's not a project that needs 100% uptime, and neither is it one I wanted to spend a lot of time managing or even checking up on, so Kubernetes with Spot VM's seemed the most cost effective solution, ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/kube-to-mig/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/kube-to-mig/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/kube-to-mig/&text=From+Kubernetes+to+a+Self-Healing%2C+Low-Cost+Infrastructure" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/kube-to-mig/&title=From+Kubernetes+to+a+Self-Healing%2C+Low-Cost+Infrastructure&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 341<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26138"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="local llm" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-2-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-2-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-2-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-2-1536x857.png 1536w" /></a></div> 342<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/" class="_blank cvplbd" target="_blank" >Combining local and hosted llm to minimize token cost</a></h4><div class="pt-cv-content">Minimize AI token cost by using a hosted LLm (eg Gemini) as a strategic planner and a local model (eg Gemma) as the executor. As an open source developer, my work is voluntary and unpaid, and therefore have to balance the potential token cost at my own personal expense, versus ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/&text=Combining+local+and+hosted+llm+to+minimize+token+cost" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/combining-local-and-hosted-llm-to-minimize-token-cost/&title=Combining+local+and+hosted+llm+to+minimize+token+cost&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 343<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26130"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gas-fakes modernization" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/06/image-1536x857.png 1536w" /></a></div> 344<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/" class="_blank cvplbd" target="_blank" >Bringing Apps Script to the desktop – the why, where and how of gas-fakes</a></h4><div class="pt-cv-content">A brief summary on approaching parity of Google Apps Script methods and classes, some of the 'extras' gas-fakes provides for platform variety, production, development and testing and glimpse of some of the techniques used to get there. Introduction: The Challenge of the Scripting Layer Google Apps Script (GAS) is a ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/&text=Bringing+Apps+Script+to+the+desktop+%26%238211%3B+the+why%2C+where+and+how+of+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/the-why-and-how-of-gas-fakes/&title=Bringing+Apps+Script+to+the+desktop+%26%238211%3B+the+why%2C+where+and+how+of+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 345<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26102"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gas-fakes serve" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/05/srv-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/05/srv-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/srv-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/srv-1536x857.png 1536w" /></a></div> 346<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/" class="_blank cvplbd" target="_blank" >Local Apps Script Webapp and UI Emulation with gas-fakes</a></h4><div class="pt-cv-content">gas-fakes provides a powerful emulation layer that allows GAS projects to run on Node.js as if they were native. The latest feature release takes this a
346step further by introducing comprehensive Local Web Development capabilities, allowing you to build and test Web Apps and UI Add-ons entirely on your local ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/&text=Local+Apps+Script+Webapp+and+UI+Emulation+with+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/local-apps-script-webapp-and-ui-emulation/&title=Local+Apps+Script+Webapp+and+UI+Emulation+with+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 347<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26093"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gf-agent-orchestration/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gf_agent" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/05/unnamed-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/05/unnamed-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/unnamed-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/unnamed-1536x857.png 1536w" /></a></div> 348<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gf-agent-orchestration/" class="_blank cvplbd" target="_blank" >From Words to Workspace: High-Fidelity Automation with gf_agent and gas-fakes</a></h4><div class="pt-cv-content">**`gf_agent`** provides **no-code Google Workspace automation** by converting natural language prompts into precise, locally executed actions. By using the **`gas-fakes`** emulation layer, it ensures these tasks run with **complete parity** to the live Google environment, relying on a foundation of over a thousand routine tests and condensed documentation to maintain ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gf-agent-orchestration/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gf-agent-orchestration/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gf-agent-orchestration/&text=From+Words+to+Workspace%3A+High-Fidelity+Automation+with+gf_agent+and+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gf-agent-orchestration/&title=From+Words+to+Workspace%3A+High-Fidelity+Automation+with+gf_agent+and+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 349<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26086"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/add-skills-gf_agent/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="unbound" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/05/unbound-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/05/unbound-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/unbound-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/unbound-1536x857.png 1536w, https://ramblings.mcpher.com/wp-content/uploads/2026/05/unbound-2048x1143.png 2048w" /></a></div> 350<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/add-skills-gf_agent/" class="_blank cvplbd" target="_blank" >Add your own agent skills to gf_agent</a></h4><div class="pt-cv-content">The gf_agent is a specialized natural language automation agent designed for the Gemini CLI and its built-in Model Context Protocol (MCP) server. By understanding the full range of gas-fakes servicesâwhich emulates Google Apps Script (GAS) on Node.jsâit allows users to automate Worksp
350ace tasks using natural language prompts directly from the ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/add-skills-gf_agent/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/add-skills-gf_agent/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/add-skills-gf_agent/&text=Add+your+own+agent+skills+to+gf_agent" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/add-skills-gf_agent/&title=Add+your+own+agent+skills+to+gf_agent&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 351<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26078"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gas-fakes-agent/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gf_agent" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2-1536x857.png 1536w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2-2048x1143.png 2048w" /></a></div> 352<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gas-fakes-agent/" class="_blank cvplbd" target="_blank" >gas-fakes agent: local natural language requests against workspace resources</a></h4><div class="pt-cv-content">gf_agent is an interactive automation agent designed for the Gemini CLI that enables users to execute Google Workspace tasks locally. By leveraging the gas-fakes framework, it allows for seamless automation of tasks like managing spreadsheets, emails, and calendars directly from a local environment using natural language. Advantages for developers and ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gas-fakes-agent/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gas-fakes-agent/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gas-fakes-agent/&text=gas-fakes+agent%3A+local+natural+language+requests+against+workspace+resources" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gas-fakes-agent/&title=gas-fakes+agent%3A+local+natural+language+requests+against+workspace+resources&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 353<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26067"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="scriptdb is back" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1-1536x857.png 1536w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1-2048x1143.png 2048w" /></a></div> 354<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/" class="_blank cvplbd" target="_blank" >Resurrecting ScriptDb – nosql database for Apps Script</a></h4><div class="pt-cv-content">**scriptdb-redux** is a modern resurrection of the original Google Apps Script **ScriptDb** service, offering a simple, document-oriented **NoSQL database** for permanently storing JavaScript objects. This **drop-in replacement** maintains full compatibility with the classic APIâincluding functions like `save`, `load`, and `query`âwhile leveraging **Upstash Redis** as a high-performance persistent store. Designed for ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/&text=Resurrecting+ScriptDb+%26%238211%3B+nosql+database+for+Apps+Script" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/resurrecting-scriptdb-nosql-database-for-apps-script/&title=Resurrecting+ScriptDb+%26%238211%3B+nosql+database+for+Apps+Script&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 355<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26063"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="Apps Script JDBC
355service on Node with gas-fakes" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-1536x857.png 1536w, https://ramblings.mcpher.com/wp-content/uploads/2026/04/image-2048x1143.png 2048w" /></a></div> 356<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/" class="_blank cvplbd" target="_blank" >Apps Script JDBC service on Node with gas-fakes</a></h4><div class="pt-cv-content">gas-fakes emulates the Google Apps Script environment locally, allowing developers to transition between local Node.js development and live execution This article addresses JDBC connectivity issues, as the native Apps Script driver often rejects modern connection strings that include unsupported SSL or tunneling parameters gas-fakes CLI tool automates the normalization of ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/&text=Apps+Script+JDBC+service+on+Node+with+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/apps-script-jdbc-service-on-node-with-gas-fakes/&title=Apps+Script+JDBC+service+on+Node+with+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 357<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26053"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gas-fakes-github-actions-wif/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="1017" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="github actions" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-8-768x1152.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-8-768x1152.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-8-200x300.png 200w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-8.png 1024w" /></a></div> 358<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gas-fakes-github-actions-wif/" class="_blank cvplbd" target="_blank" >Run native apps script on Github actions with workload identity federation and gas-fakes</a></h4><div class="pt-cv-content">GitHub Actions: The New Serverless Frontier for Google Apps Script Google Apps Script (GAS) has traditionally been limited to its native editor and runtime environment, but recent developments in the gas-fakes ecosystem have transformed GitHub Actions into a powerful serverless platform for running native GAS workloads. By leveraging the @mcpher/gas-fakes ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gas-fakes-github-actions-wif/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gas-fakes-github-actions-wif/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gas-fakes-github-actions-wif/&text=Run+native+apps+script+on+Github+actions+with+workload+identity+federation+and+gas-fakes" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gas-fakes-github-actions-wif/&title=Run+native+apps+script+on+Github+actions+with+workload+identity+federation+and+gas-fakes&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 359<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26038"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gassypedia-2-years/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="1215" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gassypedia" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-768x1376.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-768x1376.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-167x300.png 167w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-857x1536.png 857w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-1143x2048.png 1143w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-5-scaled.png 1429w" /></a></div> 360<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gassypedia-2-years/" class="_blank cvplbd" target="_blank" >Gassypedia: The State of Public Apps Script: A Two-Year Retrospective</a></h4><div class="pt-cv-content">This month marks the second anniversary of tracking the public presence of Google Apps Script (GAS) on GitHub through Gassypedia. By monitoring repositories and manifests over the last two years, we have gained unprecedented
360insight into how developers are using the platform and how the community has evolved. The Scale ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gassypedia-2-years/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gassypedia-2-years/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gassypedia-2-years/&text=Gassypedia%3A+The+State+of+Public+Apps+Script%3A+A+Two-Year+Retrospective" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gassypedia-2-years/&title=Gassypedia%3A+The+State+of+Public+Apps+Script%3A+A+Two-Year+Retrospective&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 361<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26023"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="379" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="gas-fakes and msgraph" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-3-768x429.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-3-768x429.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-3-300x167.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-3-1536x857.png 1536w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-3-2048x1143.png 2048w" /></a></div> 362<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/" class="_blank cvplbd" target="_blank" >Yes – you can execute native Apps Script with Office 365 back end</a></h4><div class="pt-cv-content">gas-fakes emulates the Google Apps Script (GAS) environment natively within a Node.js runtime. By translating standard GAS service calls into granular API requests, it provides a high-fidelity, local sandbox for debugging, automated testing, and execution without the constraints of the Google Cloud IDE. Microsoft as an Apps Script backend Apps ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/&text=Yes+%26%238211%3B+you+can+execute+native+Apps+Script+with+Office+365+back+end" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/ative-apps-script-with-office-365-back-end/&title=Yes+%26%238211%3B+you+can+execute+native+Apps+Script+with+Office+365+back+end&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div> 363<div class=" pt-cv-content-item pt-cv-2-col" data-pid="26016"><div class="pt-cv-thumb-wrapper pull-right miniwrap"><a href="https://ramblings.mcpher.com/gas-fakes-wif/" class="_blank pt-cv-href-thumbnail pt-cv-thumb-right cvplbd cvp-lazy-container" target="_blank" ><img width="678" height="370" src="https://ramblings.mcpher.com/wp-content/plugins/pt-content-views-pro/public/assets/images/lazy_image.png" class="pt-cv-thumbnail img-rounded pull-right pt-cv-thumbnailsm skip-lazy cvplazy" alt="All about workload identity: Running Node anywhere with Containers" decoding="async" data-cvpsrc="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-2-768x419.png" data-cvpset="https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-2-768x419.png 768w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-2-300x164.png 300w, https://ramblings.mcpher.com/wp-content/uploads/2026/03/image-2.png 1408w" /></a></div> 364<div class="pt-cv-colwrap"><h4 class="pt-cv-title pt-cv-titlesm"><a href="https://ramblings.mcpher.com/gas-fakes-wif/" class="_blank cvplbd" target="_blank" >All about workload identity: Running Node anywhere with Containers</a></h4><div class="pt-cv-content">This article explains how to break the "6-minute wall" by running Google Apps Script logic in Node.js containers across platforms like AWS, Azure, and Fly.io using the @mcpher/gas-fakes library. By implementing Workload Identity Federation (WIF), developers can achieve secure, keyless authentication that allows external
364clouds to impersonate Google Service Accounts ...<br /><div class="pt-cv-rmwrap"><a href="https://ramblings.mcpher.com/gas-fakes-wif/" class="_blank pt-cv-readmore btn btn-success cvplbd" target="_blank">Read More</a></div></div><div class="pt-cv-social-buttons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://ramblings.mcpher.com/gas-fakes-wif/" class="pt-cv-social-facebook" target="_blank"></a><a href="https://x.com/intent/tweet?url=https://ramblings.mcpher.com/gas-fakes-wif/&text=All+about+workload+identity%3A+Running+Node+anywhere+with+Containers" class="pt-cv-social-twitter" target="_blank"></a><a href="https://www.linkedin.com/shareArticle?mini=true&url=https://ramblings.mcpher.com/gas-fakes-wif/&title=All+about+workload+identity%3A+Running+Node+anywhere+with+Containers&summary=&source=" class="pt-cv-social-linkedin" target="_blank"></a></div></div></div></div></div></div> <style type="text/css" id="pt-cv-inline-style-f590d2degf"> 365#pt-cv-view-da5aca2ke1 .pt-cv-thumb-wrapper:not(.miniwrap) { width: 100%; }#pt-cv-view-da5aca2ke1 .pt-cv-thumbnail:not(.pt-cv-thumbnailsm) { height: 250px; }#pt-cv-view-da5aca2ke1 .pt-cv-thumb-wrapper.miniwrap { width: 40%; }#pt-cv-view-da5aca2ke1 .pt-cv-thumbnailsm { height: 80%; }#pt-cv-view-da5aca2ke1 > .pt-cv-page {grid-template-columns: repeat(1, 1fr);grid-gap: 30px;} 366@media all and (max-width: 1024px) { 367#pt-cv-view-da5aca2ke1 > .pt-cv-page {grid-template-columns: repeat(1, 1fr);} 368} 369@media all and (max-width: 767px) { 370#pt-cv-view-da5aca2ke1 > .pt-cv-page {grid-template-columns: repeat(1, 1fr);} 371} </style> 372 <style type="text/css" id="pt-cv-inline-style-a2e8f0d4mb">#pt-cv-view-da5aca2ke1 .pt-cv-title a, #pt-cv-view-da5aca2ke1 .panel-title { font-family: 'Roboto', Arial, serif !important; font-size: 22px !important; line-height: 1.3 !important; font-weight: 600 !important; } 373@media (min-width: 768px) and (max-width: 991px) {#pt-cv-view-da5aca2ke1 .pt-cv-title a, #pt-cv-view-da5aca2ke1 .panel-title { font-size: 15px !important }} 374@media (max-width: 767px) {#pt-cv-view-da5aca2ke1 .pt-cv-title a, #pt-cv-view-da5aca2ke1 .panel-title { font-size: 15px !important }} 375#pt-cv-view-da5aca2ke1 .pt-cv-content , #pt-cv-view-da5aca2ke1 .pt-cv-content *:not(.pt-cv-readmore):not(style):not(script) { font-family: 'Roboto', Arial, serif !important; font-size: 16px !important; line-height: 1.3 !important; } 376@media (min-width: 768px) and (max-width: 991px) {#pt-cv-view-da5aca2ke1 .pt-cv-content , #pt-cv-view-da5aca2ke1 .pt-cv-content *:not(.pt-cv-readmore):not(style):not(script) { font-size: 12px !important }} 377@media (max-width: 767px) {#pt-cv-view-da5aca2ke1 .pt-cv-content , #pt-cv-view-da5aca2ke1 .pt-cv-content *:not(.pt-cv-readmore):not(style):not(script) { font-size: 10px !important }} 378#pt-cv-view-da5aca2ke1 .pt-cv-readmore { color: #ffffff !important; background-color: #00796b !important; padding: 10px 10px 10px 10px !important; border-radius: 5px 5px 5px 5px !important; } 379#pt-cv-view-da5aca2ke1 .pt-cv-readmore:hover { color: #ffffff !important; background-color: #f40000 !important; text-transform: uppercase !important; } 380#pt-cv-view-da5aca2ke1 .img-rounded, #pt-cv-view-da5aca2ke1 .pt-cv-hover-wrapper { -webkit-border-radius: 6px !important; -moz-border-radius: 6px !important; border-radius: 6px !important; } 381#pt-cv-view-da5aca2ke1 .pt-cv-cap-w-img { border-bottom-left-radius: 6px !important; border-bottom-right-radius: 6px !important; } 382#pt-cv-view-da5aca2ke1 { text-align: left; }</style> 383 <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'></div></div> 384 <div id="recent-posts-3" class="mh-widget mh-home-2 mh-widget-col-2 widget_recent_entries"> 385 <h4 class="mh-widget-title"><span class="mh-widget-title-inner">Recent Posts</span></h4> 386 <ul> 387 <li> 388 <a href="https://ramblings.mcpher.com/5-years-in-apps-script-what-a-change-e2/">Google Apps Script â What a difference 5 years make – Episode 2</a> 389 </li> 390 <li> 391 <a href="https://ramblings.mcpher.com/5-years-in-apps-script-what-a-change/">Google Apps Script – What a difference 5 years make</a> 392 </li> 393 <li> 394 <a href="https://ramblings.mcpher.com/looping-through-files-in-a-directory/">Looping through files in a directory</a> 395 </li> 396 <li> 397 <a href="https://ramblings.mcpher.com/use-a-spreadsheet-as-a-database-in-5-minutes/">Use a spreadsheet as a database in 5 minutes</a> 398 </li> 399 <li> 400 <a href="https://ramblings.mcpher.com/2019-decade-in-apps-scrip/">2019 – a decade in Apps Script</a> 401 </li> 402 </ul> 403 404 </div> <div class="clearfix"> 405 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-home-area-3"> 406 <div id="custom_html-27" class="widget_text mh-widget mh-home-3 widget_custom_html"><div class="textwidget custom-html-widget"><div class="su-spacer" style="height:10px"></div></div></div> </div> 407 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-margin-left mh-home-area-4"> 408 <div id="custom_html-28" class="widget_text mh-widget mh-home-4 widget_custom_html"><div class="textwidget custom-html-widget"><div class="su-spacer" style="height:10px"></div></div></div> </div> 409 </div> 410 </div> 411 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-home-area-6"> 412 <div id="search-4" class="mh-widget mh-home-6 widget_search"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Search the site</span></h4><form role="search" method="get" class="search-form" action="https://ramblings.mcpher.com/"> 413 <label> 414 <span class="screen-reader-text">Search for:</span> 415 <input type="search" class="search-field" placeholder="Search …" value="" name="s" /> 416 </label> 417 <input type="submit" class="search-submit" value="Search" /> 418 </form></div><div id="html5_cumulus-3" class="mh-widget mh-home-6 html5_cumulus"> 419<h4 class="mh-widget-title"><span class="mh-widget-title-inner">Or select a Tag in the below cloud</span></h4> 420<div id="html5-cumulus-tkbdib"> 421<canvas width="220" height="220" id="canvas-tkbdib" style="background-color: none;"> 422<p>Your browser doesn't support the HTML5 CANVAS tag.</p> 423</canvas> 424 425<div style="display: none" id="tagcloud-tkbdib"> 426<ul class='wp-tag-cloud' role='list'> 427 <li><a href="https://ramblings.mcpher.com/tag/visualization/" class="tag-cloud-link tag-link-154 tag-link-position-1" style="font-size: 14.380952380952pt;" aria-label="Visualization (34 items)">Visualization</a></li> 428 <li><a href="https://ramblings.mcpher.com/tag/apps-script-snippets/" class="tag-cloud-link tag-link-161 tag-link-position-2" style="font-size: 7.6761904761905pt;" aria-label="Apps script snippets (23 items)">Apps script snippets</a></li> 429 <li><a href="https://ramblings.mcpher.com/tag/scriptdb/" class="tag-cloud-link tag-link-187 tag-link-position-3" style="font-size: 7.6761904761905pt;" aria-label="Scriptdb (23 items)">Scriptdb</a></li> 430 <li><a href="https://ramblings.mcpher.com/tag/earth/" class="tag-cloud-link tag-link-369 tag-link-position-4" style="font-size: 8.5142857142857pt;" aria-label="earth (24 items)">earth</a></li> 431 <li><a href="https://ramblings.mcpher.com/tag/d3/" class="tag-cloud-link tag-link-143 tag-link-position-5" style="font-size: 12.285714285714pt;" aria-label="D3 (30 items)">D3</a></li> 432 <li><a href="https://ramblings.mcpher.com/tag/excel/" class="tag-cloud-link tag-link-14 tag-link-position-6" style="font-size: 41.2pt;" aria-label="excel (149 items)">excel</a></li> 433 <li><a href="https://ramblings.mcpher.com/tag/oauth2/" class="tag-cloud-link tag-link-148 tag-link-position-7" style="font-size: 26.533333333333pt;" aria-label="Oauth2 (67 items)">Oauth2</a></li> 434 <li><a href="https://ramblings.mcpher.com/tag/archived/" class="tag-cloud-link tag-link-138 tag-link-position-8" style="font-size: 6pt;" aria-label="Deprecated (21 items)">Deprecated</a></li> 435 <li><a href="https://ramblings.mcpher.com/tag/google-cloud/" class="tag-cloud-link tag-link-119 tag-link-position-9" style="font-size: 15.219047619048pt;" aria-label="Google Cloud (35 items)">Google Cloud</a></li> 436 <li><a href="https://ramblings.mcpher.com/tag/json/" class="tag-cloud-link tag-link-153 tag-link-position-10" style="font-size: 18.990476190476pt;" aria-label="Json (44 items)">Json</a></li> 437 <li><a href="https://ramblings.mcpher.com/tag/maps/" class="tag-cloud-link tag-link-255 tag-link-position-11" style="font-size: 14.380952380952pt;" aria-label="maps (34 items)">maps</a></li> 438 <li><a href="https://ramblings.mcpher.com/tag/javascript/" class="tag-cloud-link tag-link-132 tag-link-position-12" style="font-size: 32.819047619048pt;" aria-label="JavaScript (95 items)">JavaScript</a></li> 439 <li><a href="https://ramblings.mcpher.com/tag/sheets/" class="tag-cloud-link tag-link-211 tag-link-position-13" style="font-size: 11.028571428571pt;" aria-label="Sheets (28 items)">Sheets</a></li> 440 <li><a href="https://ramblings.mcpher.com/tag/vba/" class="tag-cloud-link tag-link-23 tag-link-position-14" style="font-size: 37.847619047619pt;" aria-label="vba (126 items)">vba</a></li> 441 <li><a href="https://ramblings.mcpher.com/tag/kubernetes/" class="tag-cloud-link tag-link-116 tag-link-position-15" style="font-size: 13.961904761905pt;" aria-label="Kubernetes (33 items)">Kubernetes</a></li> 442 <li><a href="https://ramblings.mcpher.com/tag/gas-fakes/" class="tag-cloud-link tag-link-552 tag-link-position-16" style="font-size: 9.771428571428
4426pt;" aria-label="gas-fakes (26 items)">gas-fakes</a></li> 443 <li><a href="https://ramblings.mcpher.com/tag/apps-script/" class="tag-cloud-link tag-link-133 tag-link-position-17" style="font-size: 50pt;" aria-label="apps script (243 items)">apps script</a></li> 444 <li><a href="https://ramblings.mcpher.com/tag/colors/" class="tag-cloud-link tag-link-140 tag-link-position-18" style="font-size: 13.961904761905pt;" aria-label="colors (33 items)">colors</a></li> 445 <li><a href="https://ramblings.mcpher.com/tag/node/" class="tag-cloud-link tag-link-382 tag-link-position-19" style="font-size: 13.961904761905pt;" aria-label="node (33 items)">node</a></li> 446 <li><a href="https://ramblings.mcpher.com/tag/github/" class="tag-cloud-link tag-link-183 tag-link-position-20" style="font-size: 11.866666666667pt;" aria-label="github (29 items)">github</a></li> 447</ul> 448</div> 449
449<script type="text/javascript"> 450 jQuery(document).ready(function() { 451 if( ! jQuery('#canvas-tkbdib').tagcanvas({ 452 textFont: 'Roboto,"Arial Black",sans-serif', 453 textColour: '#696969', 454 outlineColour: '#dd3333', 455 reverse: true, 456 textHeight:16, 457 shape: "sphere", 458 depth: 0.8,decel:0.99,padding:0, 459 wheelZoom: true, 460 dragControl: false, 461 fadeIn: 0, 462 freezeActive: false, 463 outlineMethod: "outline", 464 outlineOffset: "5", 465 outlineRadius: "0", 466 outlineThickness: "2", 467 maxSpeed: 0.05},'tagcloud-tkbdib') 468 ){ 469 jQuery('#html5-cumulus-tkbdib').hide(); 470 } 471 }); 472 </script>
472 473 </div><div id="mh_magazine_youtube-3" class="mh-widget mh-home-6 mh_magazine_youtube"><h4 class="mh-widget-title"><span class="mh-widget-title-inner"><i class="fa fa-youtube-play"></i>My YouTube Channel</span></h4> <div class="mh-video-widget"> 474 <div class="mh-video-container"> 475 <iframe seamless width="1280" height="720" src="//www.youtube.com/embed/rMXC86fV0Ek?wmode=opaque&hd=1&autoplay=0&showinfo=0&controls=2&rel=1" allowfullscreen></iframe> 476 </div> 477 </div></div><div id="shortcodes-ultimate-5" class="mh-widget mh-home-6 shortcodes-ultimate"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">My Publications</span></h4><div class="textwidget"><div class="su-divider su-divider-style-default" style="margin:1px 0;border-width:1px;border-color:#FFFFFF"></div></div></div><div id="mh_magazine_custom_slider-9" class="mh-widget mh-home-6 mh_magazine_custom_slider"> <div class="flexslider mh-slider-widget mh-slider-layout1"> 478 <ul class="slides"> <li class="mh-slider-item"> 479 <article> 480 <a href="https://bookauthority.org/books/best-google-books?t=5xhjwb&s=award&book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank"> 481 <img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/Screenshot-2022-08-16-09.12.31.png" alt="Going GAS made it to the Best Google Books of All Time" /> 482 </a> 483 <div class="mh-slider-caption"> 484 <div class="mh-slider-content"> 485 <h2 class="mh-slider-title"> 486 <a href="https://bookauthority.org/books/best-google-books?t=5xhjwb&s=award&book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank"> 487 Going GAS made it to the Best Google Books of All Time </a> 488 </h2> 489 <div class="mh-slider-excerpt mh-excerpt"> 490 BookAuthority collects and ranks the best books in the world, and it is a great honor to get this kind of recognition. Thank you for all your support! <a class="mh-excerpt-more" href="https://bookauthority.org/books/best-google-books?t=5xhjwb&s=award&book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank"> 491 [...] </a> 492 </div> 493 </div> 494 </div> 495 </article> 496 </li> <li class="mh-slider-item"> 497 <article> 498 <a href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank"> 499 <img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download.jpeg" alt="Going GAS Video" /> 500 </a> 501 <div class="mh-slider-caption"> 502 <div class="mh-slider-content"> 503 <h2 class="mh-slider-title"> 504 <a href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank"> 505 Going GAS Video </a> 506 </h2> 507 <div class="mh-slider-excerpt mh-excerpt"> 508 An accelerated video course over about 8 hours and 70 lessons taking you through JavaScript and Apps Script from start to finish. <a class="mh-excerpt-more" href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank"> 509 [...] </a> 510 </div> 511 </div> 512 </div> 513 </article> 514 </li> <li class="mh-slider-item"> 515 <article> 516 <a href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank"> 517 <img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download-2.jpeg" alt="Video Course for Beginners" /> 518 </a> 519 <div class="mh-slider-caption"> 520 <div class="mh-slider-content"> 521 <h2 class="mh-slider-title"> 522 <a href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank"> 523 Video Course for Beginners </a> 524 </h2> 525 <div class="mh-slider-excerpt mh-excerpt"> 526 A video course over about 8 hours and 70 lessons taking you through the basics of Apps Script and JavaScript <a class="mh-excerpt-more" href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank"> 527 [...] </a> 528 </div> 529 </div> 530 </div> 531 </article> 532 </li> <li class="mh-slider-item"> 533 <article> 534 <a href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank"> 535 <img src="https://ramblings.mcpher.com/wp-content/uploads/2019/11/going-gas-e1580831309419.jpg" alt="Going GAS Book" /> 536 </a> 537 <div class="mh-slider-caption"> 538 <div class="mh-slider-content"> 539 <h2 class="mh-slider-title"> 540 <a href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank"> 541 Going GAS Book </a> 542 </h2> 543 <div class="mh-slider-excerpt mh-excerpt"> 544 For those who prefer book and eBook formats, a 450+ page deep dive into Apps Script. Especially useful for those transitioning from another platform. <a class="mh-excerpt-more" href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank"> 545 [...] </a> 546 </div> 547 </div> 548 </div> 549 </article> 550 </li> <li class="mh-slider-item"> 551 <article> 552 <a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank"> 553 <img src="https://ramblings.mcpher.com/wp-content/uploads/2023/08/CreateAI-PoweredWorkspaceAdd-ons-Cover.jpg" alt="Live Project" /> 554 </a> 555 <div class="mh-slider-caption"> 556 <div class="mh-slider-content"> 557 <h2 class="mh-slider-title"> 558 <a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank"> 559 Live Project </a> 560 </h2> 561 <div class="mh-slider-excerpt mh-excerpt"> 562 Create, Implement and test a AI Powered Google Worksp
562ace Add-Ons. add functionality from a collection of Google Cloud APIs such as Cloud Storage, CardService, Drive and others <a class="mh-excerpt-more" href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank"> 563 [...] </a> 564 </div> 565 </div> 566 </div> 567 </article> 568 </li> </ul> 569 </div></div><div id="custom_html-26" class="widget_text mh-widget mh-home-6 widget_custom_html"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Google developers expert program</span></h4><div class="textwidget custom-html-widget"><p> 570 The Google Developers Experts (GDE) Program is a community of outstanding professionals, developers, and thought leaders. Experts share their expertise and passion with other developers and tech communities. </p> 571<p> 572 573 574<iframe width="100%" src="https://www.youtube.com/embed/m-ig1pECpSc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> 575</p> 576<p> 577<a href="https://developers.google.com/community/experts/directory/profile/profile-bruce-mcpherson">My GDE profile - member since 2014</a> 578</p><p> 579<a href="https://developers.google.com/community/experts/directory/profile/profile-bruce-mcpherson"><img class="aligncenter wp-image-2751 size-thumbnail" src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/experts-digital-badge-logos-2022_2022.png" alt="" width="171" /></a> 580 </p> 581<p> 582 583 584<a href="https://developers.google.com/community/experts/directory/profile/profile-bruce-mcpherson"><img class="aligncenter wp-image-2751 size-thumbnail" src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/experts-digital-badge-logos-2022_googleworkspace.png" alt="" width="171" /></a> 585</p> 586 587 588</div></div><div id="custom_html-41" class="widget_text mh-widget mh-home-6 widget_custom_html"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Support my research and site</span></h4><div class="textwidget custom-html-widget">
588<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="brucemcpher" data-color="#00796b" data-emoji="â" data-font="Cookie" data-text="Buy me a coffee?" data-outline-color="#ffffff" data-font-color="#ffffff" data-coffee-color="#FFDD00" ></script>
588</div></div> </div> 589 </div> 590 <div class="mh-home-columns clearfix"> 591 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-home-area-8"> 592 <style>/* ul */ 593.arpw-ul { 594display:block; 595margin-block-top:10px; 596margin-block-end:10px; 597 598 599} 600 601/* li */ 602.arpw-li {} 603 604/* title */ 605.arpw-title { 606display:block; 607margin-top:10px; 608margin-block-end:10px; 609font-size: 18px; 610font-family: Roboto; 611color: #e64946;} 612 613/* thumbnail */ 614.arpw-thumbnail { 615vertical-align:top;} 616 617/* date */ 618.arpw-time {} 619 620/* excerpt */ 621.arpw-summary { 622font-family:roboto; 623font-size: 14px;}</style><div id="arpw-widget-3" class="mh-widget mh-home-8 arpw-widget-random"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Discover More Content</span></h4><div class="arpw-random-page "><ul class="arpw-ul"><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/excel-to-json-and-back/rest-to-excel-library/fusion-data-to-excel/" rel="bookmark"><img width="150" height="150" src="https://ramblings.mcpher.com/wp-content/uploads/2019/12/exceltojson-150x150.jpg" class="arpw-thumbnail aligncenter wp-post-image" alt="Fusion data to Excel" decoding="async" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/excel-to-json-and-back/rest-to-excel-library/fusion-data-to-excel/" rel="bookmark">Fusion data to Excel</a><div class="arpw-summary">In Flight data from Fusion I showed how to get a large amount of data from various Google Fusion tables into a …</div></li><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/apps-script/apps-script-v8/destructuring/" rel="bookmark"><img width="150" height="143" src="https://ramblings.mcpher.com/wp-content/uploads/2020/02/V8_JavaScript_engine_logo-e1582740621562-150x143.png" class="arpw-thumbnail aligncenter wp-post-image" alt="Apps Script V8: spreading and destructuring" decoding="async" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/apps-script/apps-script-v8/destructuring/" rel="bookmark">Apps Script V8: spreading and destructuring</a><div class="arpw-summary">Apps Script V8 adds destructuring from JavaScript ES6. Legacy Apps Script already had destructuring of arrays added fairly recently, but …</div></li><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/recursion/sudoku-generator-and-solver/soak-test/" rel="bookmark"><img width="150" height="150" src="https://ramblings.mcpher.com/wp-content/uploads/2020/01/recursion-150x150.jpg" class="arpw-thumbnail aligncenter wp-post-image" alt="Soak Test" decoding="async" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/recursion/sudoku-generator-and-solver/soak-test/" rel="bookmark">Soak Test</a><div class="arpw-summary">Testing random problems One big problem with testing these kind of solutions is that by nature, the problem is random …</div></li><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/oauth2-for-apps-script-in-a-few-lines-of-code/goa-in-a-sidebar/" rel="bookmark"><img width="150" height="150" src="https://ramblings.mcpher.com/wp-content/uploads/2019/12/Oauth2APIs-150x150.png" class="arpw-thumbnail aligncenter wp-post-image" alt="Goa in a sidebar" decoding="async" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/oauth2-for-apps-script-in-a-few-lines-of-code/goa-in-a-sidebar/" rel="bookmark">Goa in a sidebar</a><div class="arpw-summary">This describes how to implement goa in a sidebar. The example will assume that the authorization process should be repeated …</div></li><li class="arpw-li arpw-clearfix"><a class="arpw-title" href="https://ramblings.mcpher.com/google-analytics/universal-analytics-measurement-protocol-for-your-gas-libraries/universal-analytics-for-checking-co-operating-processes/" rel="bookmark">Universal analytics for checking co-operating processes</a><div class="arpw-summary">In Instrumenting VBA for Google Analytics and Universal analytics measurement protocol for your GAS libraries I showed how you could us Google Analytics to …</div></li></ul></div><!-- Generated by https://wordpress.org/plugins/advanced-random-posts-widget/ --></div><div id="mh_magazine_custom_pages-4" class="mh-widget mh-home-8 mh_magazine_custom_pages"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">The most geeky things</span></h4> <ul class="mh-custom-posts-widget mh-custom-pages-widget clearfix"> <li class="mh-custom-posts-item mh-custom-posts-large clearfix post-2764 page type-page status-publish has-post-thumbnail category-officevba"> 624 <figure class="mh-custom-posts-thumb-xl"> 625 <a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/classes/promises-in-vba/" title="Promises in VBA"><img width="300" height="168" src="https://ramblings.mcpher.com/wp-content/uploads/2019/12/VBA.jpg" class="attachment-mh-magazine-medium size-mh-magazine-medium wp-post-image" alt="" decoding="async" /> </a> 626 </figure> 627 <div class="mh-custom-posts-content"> 628 <div class="mh-custom-posts-header"> 629 <h3 class="mh-custom-posts-xl-title"> 630 <a href="https://ramblings.mcpher.com/classes/promises-in-vba/" title="Promises in VBA"> 631 Promises in VBA </a> 632 </h3> 633 </div> 634 <div class="mh-excerpt">Using promises in JavaScript and other languages is the preferred way to orchestrate the completion of asynchronous activities. Hereâs a (not perfect but fun) Promise implementation in VBA. Example includes getting data from Google Fusion <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/classes/promises-in-vba/" title="Promises in VBA">[...]</a></div> </div> 635 </li> <li class="mh-custom-posts-item mh-custom-posts-large clearfix post-1399 page type-page status-publish has-post-thumbnail category-redisreactredux category-express category-snippets"> 636 <figure class="mh-custom-posts-thumb-xl"> 637 <a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/reactreduxredisfirebase/" title="React, Redux, Redis, Material-UI and Firebase"><img width="326" height="245" src="https://ramblings.mcpher.com/wp-content/uploads/2019/11/getting-started-with-ephemeral-exchange-for-push-notification-326x245.png" class="attachment-mh-magazine-medium size-mh-magazine-medium wp-post-image" alt="" decoding="async" srcset="https://ramblings.mcpher.com/wp-content/uploads/2019/11/getting-started-with-ephemeral-exchange-for-push-notification-326x245.png 326w, https://ramblings.mcpher.com/wp-content/uploads/2019/11/getting-started-with-ephemeral-exchange-for-push-notification-678x509.png 678w, https://ramblings.mcpher.com/wp-content/uploads/2019/11/getting-started-with-ephemeral-exchange-for-push-notification-80x60.png 80w" sizes="(max-width: 326px) 100v
637w, 326px" /> </a> 638 </figure> 639 <div class="mh-custom-posts-content"> 640 <div class="mh-custom-posts-header"> 641 <h3 class="mh-custom-posts-xl-title"> 642 <a href="https://ramblings.mcpher.com/reactreduxredisfirebase/" title="React, Redux, Redis, Material-UI and Firebase"> 643 React, Redux, Redis, Material-UI and Firebase </a> 644 </h3> 645 </div> 646 <div class="mh-excerpt">A whole bunch of front end platform libraries that go together really well, but that are hard to grasp and get started with. Hereâs a bunch of snippets to help show how all these things <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/reactreduxredisfirebase/" title="React, Redux, Redis, Material-UI and Firebase">[...]</a></div> </div> 647 </li> <li class="mh-custom-posts-item mh-custom-posts-large clearfix post-1559 page type-page status-publish has-post-thumbnail category-colors category-officevba category-vba tag-colors tag-excel tag-vba"> 648 <figure class="mh-custom-posts-thumb-xl"> 649 <a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/color-fiesta/" title="Color Fiesta"><img width="326" height="154" src="https://ramblings.mcpher.com/wp-content/uploads/2019/12/colorfiesta-326x154.jpg" class="attachment-mh-magazine-medium size-mh-magazine-medium wp-post-image" alt="" decoding="async" srcset="https://ramblings.mcpher.com/wp-content/uploads/2019/12/colorfiesta-326x154.jpg 326w, https://ramblings.mcpher.com/wp-content/uploads/2019/12/colorfiesta-300x141.jpg 300w, https://ramblings.mcpher.com/wp-content/uploads/2019/12/colorfiesta.jpg 328w" sizes="(max-width: 326px) 100vw, 326px" /> </a> 650 </figure> 651 <div class="mh-custom-posts-content"> 652 <div class="mh-custom-posts-header"> 653 <h3 class="mh-custom-posts-xl-title"> 654 <a href="https://ramblings.mcpher.com/color-fiesta/" title="Color Fiesta"> 655 Color Fiesta </a> 656 </h3> 657 </div> 658 <div class="mh-excerpt">The mathematics of color is a complex and interesting topic. Here youâll find Google Apps Script, VBA and javascript examples of color manipulation including finding the closest match to a given color in a defined <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/color-fiesta/" title="Color Fiesta">[...]</a></div> </div> 659 </li> <li class="mh-custom-posts-item mh-custom-posts-large clearfix post-2774 page type-page status-publish has-post-thumbnail category-officevba category-vba tag-automatic-documentation tag-json tag-vba"> 660 <figure class="mh-custom-posts-thumb-xl"> 661 <a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/automatic-documentation/" title="Automatic documentation"><img width="300" height="168" src="https://ramblings.mcpher.com/wp-content/uploads/2019/12/VBA.jpg" class="attachment-mh-magazine-medium size-mh-magazine-medium wp-post-image" alt="" decoding="async" /> </a> 662 </figure> 663 <div class="mh-custom-posts-content"> 664 <div class="mh-custom-posts-header"> 665 <h3 class="mh-custom-posts-xl-title"> 666 <a href="https://ramblings.mcpher.com/automatic-documentation/" title="Automatic documentation"> 667 Automatic documentation </a> 668 </h3> 669 </div> 670 <div class="mh-excerpt">Automating document ,creating Google Visualization and static tables of VBA projects, serialize instances of VBA classes and generating Google Apps Script skeleton of VBA projects. […] Share with your network</div> </div> 671 </li> </ul></div> </div> 672 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-margin-left mh-home-area-9"> 673 <div id="custom_html-30" class="widget_text mh-widget mh-home-9 widget_custom_html"><div class="textwidget custom-html-widget"><div class="su-spacer" style="height:10px"></div></div></div> </div> 674 <div class="mh-widget-col-1 mh-sidebar mh-home-sidebar mh-margin-left mh-home-area-10"> 675 <div id="custom_html-35" class="widget_text mh-widget mh-home-10 widget_custom_html"><div class="textwidget custom-html-widget"><div class="su-spacer" style="height:10px"></div></div></div> </div> 676 </div> 677 </div> 678 </div> 679<footer class="mh-footer" itemscope="itemscope" itemtype="https://schema.org/WPFooter"> 680<div class="mh-container mh-container-inner mh-footer-widgets mh-row clearfix"> 681<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols mh-footer-area mh-footer-1"> 682<div id="custom_html-14" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Book : Going Gas</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="https://www.oreilly.com/library/view/going-gas/9781491940457/"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2023/03/going-gas-footer2.jpg" alt="Going Gas book"/></a></figure> 683<div style="margin-top:4px"> 684 <p> 685 Whether youâre moving from Microsoft Office to Google Docs or simply want to learn how to automate Docs with Google Apps Script, this practical guide shows you by example how to work with each of the major Apps Script services. The book introduces JavaScript basics for experienced developers unfamiliar with the language, and demonstrates ways to build real-world apps using all of the Apps Script services previously covered. 686 </p> 687</div></div></div></div> 688<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols mh-footer-area mh-footer-2"> 689<div id="custom_html-15" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Video: Apps Script for developers</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="http://shop.oreilly.com/product/0636920048503.do"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2023/03/video-footer.jpg" alt="" width="100%" /></a></figure> 690<div style="margin-top:4px"> 691 <p> 692 In this Google Apps Script for Developers training course, expert author Bruce Mcpherson will teach you how to customize, enhance, and automate your Google Docs, Sheets, and Gmail with Google Apps Script. This course is designed for the absolute beginner, meaning no previous experience with Google Apps Script is required.</p> 693 694<p> 695Once you have completed this computer based training course, you will have learned how to customize, enhance, and automate your Docs, Sheets, and Gmail with Google Apps Script. 696 </p> 697 698</div> 699</div></div></div> 700<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols mh-footer-area mh-footer-3"> 701<div id="custom_html-16" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Video: Apps Script for beginners</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="https://shop.oreilly.com/product/0636920054115.do"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download-2.jpeg" alt="" width="100%" /></a></figure> 702<div style="margin-top:4px"> 703 <p> 704
705 706The key to using Google Apps Script is understanding its underlying language â JavaScript. The course teaches you enough of the concepts and syntax of JavaScript that youâll come away with the ability to confidently code Google Apps Script tasks on your own. 707 </p> 708</div></div></div></div> 709<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols mh-footer-area mh-footer-4"> 710<div id="custom_html-33" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Live Book</span></h6><div class="textwidget custom-html-widget"><!-- wp:image {"id":24146} --> 711<figure class="wp-block-image"><a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons"><img src="https://ramblings.mcpher.com/wp-content/uploads/2023/08/CreateAI-PoweredWorkspaceAdd-ons-Cover.jpg" class="wp-image-24146" 712 alt="Manning liveproject create ai powered Google Workspace Add-ons"/></a></figure> 713 714 715<p>create, implement and test a Workspace Add-on</p><p>add functionality from a collection of Google Cloud APIs such as Cloud Storage, CardService, Drive and others</p><p>organize extracted data from a variety of documents using the Google AI Platform </p><a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons"><b>Manning LiveProject</b></a> 716<!-- /wp:image --></div></div></div> 717</div> 718</footer> 719<div class="mh-copyright-wrap"> 720 <div class="mh-container mh-container-inner clearfix"> 721 <p class="mh-copyright"> 722 bruce mcpherson is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Based on a work at http://www.mcpher.com. Permissions beyond the scope of this license may be available at code use guidelines </p> 723 </div> 724</div> 725<a href="#" class="mh-back-to-top"><i class="fa fa-chevron-up"></i></a> 726</div><!-- .mh-container-outer -->
727<script type="speculationrules"> 728{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/mh-magazine/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 729</script>
vendor: 1 bytes, line 729
729
730<script id="wpo_min-footer-0-js-extra"> 731var PT_CV_PUBLIC = {"_prefix":"pt-cv-","page_to_show":"5","_nonce":"470b3aa5fd","is_admin":"","is_mobile":"","ajaxurl":"https://ramblings.mcpher.com/wp-admin/admin-ajax.php","lang":"","loading_image_src":"data:image/gif;base64,R0lGODlhDwAPALMPAMrKygwMDJOTkz09PZWVla+vr3p6euTk5M7OzuXl5TMzMwAAAJmZmWZmZszMzP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAPACwAAAAADwAPAAAEQvDJaZaZOIcV8iQK8VRX4iTYoAwZ4iCYoAjZ4RxejhVNoT+mRGP4cyF4Pp0N98sBGIBMEMOotl6YZ3S61Bmbkm4mAgAh+QQFCgAPACwAAAAADQANAAAENPDJSRSZeA418itN8QiK8BiLITVsFiyBBIoYqnoewAD4xPw9iY4XLGYSjkQR4UAUD45DLwIAIfkEBQoADwAsAAAAAA8ACQAABC/wyVlamTi3nSdgwFNdhEJgTJoNyoB9ISYoQmdjiZPcj7EYCAeCF1gEDo4Dz2eIAAAh+QQFCgAPACwCAAAADQANAAAEM/DJBxiYeLKdX3IJZT1FU0iIg2RNKx3OkZVnZ98ToRD4MyiDnkAh6BkNC0MvsAj0kMpHBAAh+QQFCgAPACwGAAAACQAPAAAEMDC59KpFDll73HkAA2wVY5KgiK5b0RRoI6MuzG6EQqCDMlSGheEhUAgqgUUAFRySIgAh+QQFCgAPACwCAAIADQANAAAEM/DJKZNLND/kkKaHc3xk+QAMYDKsiaqmZCxGVjSFFCxB1vwy2oOgIDxuucxAMTAJFAJNBAAh+QQFCgAPACwAAAYADwAJAAAEMNAs86q1yaWwwv2Ig0jUZx3OYa4XoRAfwADXoAwfo1+CIjyFRuEho60aSNYlOPxEAAAh+QQFCgAPACwAAAIADQANAAAENPA9s4y8+IUVcqaWJ4qEQozSoAzoIyhCK2NFU2SJk0hNnyEOhKR2AzAAj4Pj4GE4W0bkJQIAOw==","is_mobile_tablet":"","sf_no_post_found":"No posts found.","lf__separator":","}; 732var PT_CV_PAGINATION = {"first":"\u00ab","prev":"\u2039","next":"\u203a","last":"\u00bb","goto_first":"Go to first page","goto_prev":"Go to previous page","goto_next":"Go to next page","goto_last":"Go to last page","current_page":"Current page is","goto_page":"Go to page"}; 733//# sourceURL=wpo_min-footer-0-js-extra 734</script>
vendor: 1 bytes, line 734
734
735<script id="wpo_min-footer-0-js" src="https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1790832964/assets/wpo-minify-footer-802f1722.min.js"></script>
735 736 737<!-- Shortcodes Ultimate custom CSS - start --> 738<style type="text/css"> 739/* Spoiler Title */ 740.su-spoiler.my-custom-spoiler > .su-spoiler-title { 741 742 /* Text Size */ 743 font-size: 18px; 744 745 746 /* Background Color */ 747 background: #FFFFFF; 748 749 /* Text Color */ 750 color: #0FC700; 751 752 /* Icon Color */ 753 color: #C71E00; 754 755} 756 757/* Spoiler Icon */ 758.su-spoiler.my-custom-spoiler > .su-spoiler-title > .su-spoiler-icon { 759 760 /* Icon Color */ 761 color: #C71E00; 762} 763 764/* Spoiler Title folder*/ 765.su-spoiler.my-custom-spoiler2 > .su-spoiler-title { 766 767 /* Text Size */ 768 font-size: 18px; 769 770 771 /* Background Color */ 772 background: #FFFFFF; 773 774 /* Text Color */ 775 color: #0a7ac4; 776 777} 778 779/* Spoiler Icon folder */ 780.su-spoiler.my-custom-spoiler2 > .su-spoiler-title > .su-spoiler-icon { 781 782 /* Icon Color */ 783 color: #0592f0; 784} 785 786/*Tabs*/ 787.su-tabs > .su-tabs-nav > span.su-tabs-current:hover { 788 789 /* Background color */ 790 background-color: #ffcc00; 791 792 /* Text color */ 793 color: #00ffcc; 794 795} 796</style> 797<!-- Shortcodes Ultimate custom CSS - end --> 798</body> 799</html> 800<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: October 1, 2026 10:28 am (Europe/London UTC:1) -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.