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

<channel>
	<title>Karl&#039;s Place</title>
	<atom:link href="https://karl.kranich.org/feed/" rel="self" type="application/rss+xml" />
	<link>https://karl.kranich.org</link>
	<description>Technology, DIY, etc</description>
	<lastBuildDate>Thu, 01 Jun 2023 15:03:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.9.7</generator>
<site xmlns="com-wordpress:feed-additions:1">3494670</site>	<item>
		<title>Solved: Microsoft Videos Blank with Video Speed Controller</title>
		<link>https://karl.kranich.org/2023/06/01/solved-microsoft-videos-blank-with-video-speed-controller/</link>
					<comments>https://karl.kranich.org/2023/06/01/solved-microsoft-videos-blank-with-video-speed-controller/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Thu, 01 Jun 2023 14:56:49 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=9423</guid>

					<description><![CDATA[<p>I&#8217;ve been very frustrated lately by videos on learn.microsoft.com and azure.microsoft.com playing for a few seconds, and then blanking out. The sound keeps playing, the counter keeps advancing, but the video is blank. I finally figured out that the videos blank out when the Video Speed Controller (VSC) Chrome extension&#8217;s controls show up. This only [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2023/06/01/solved-microsoft-videos-blank-with-video-speed-controller/">Solved: Microsoft Videos Blank with Video Speed Controller</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-medium is-resized"><a href="https://karl.kranich.org/wp-content/uploads/2023/06/VSC-issue.png"><img src="https://karl.kranich.org/wp-content/uploads/2023/06/VSC-issue-300x258.png" alt="" class="wp-image-9424" width="350" height="259"/></a></figure></div>



<p>I&#8217;ve been very frustrated lately by videos on learn.microsoft.com and azure.microsoft.com playing for a few seconds, and then blanking out.  The sound keeps playing, the counter keeps advancing, but the video is blank.</p>



<p>I finally figured out that the videos blank out when the Video Speed Controller (VSC) Chrome extension&#8217;s controls show up.  This only seems to happen with Microsoft videos (learn.microsoft.com, azure.microsoft.com, etc).  And I love VSC!  It helps me speed through videos while still absorbing the content.</p>



<p>There are at least 2 workarounds:</p>



<ol><li>Edit the VSC options and add &#8220;microsoft.com&#8221; to the list of sites where the extension should be disabled.  But then I can&#8217;t speed up the videos.</li><li>Edit the VSC options and check &#8220;Hide controller by default&#8221;.  This loads VSC but doesn&#8217;t show the controls.  You can show the controls briefly to change the playback speed by hitting &#8220;v&#8221;, or just control the speed with &#8220;s&#8221; and &#8220;d&#8221;.  The video will blank out briefly while you&#8217;re adjusting the speed, but will show again when the speed display goes away.</li></ol>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2023/06/01/solved-microsoft-videos-blank-with-video-speed-controller/">Solved: Microsoft Videos Blank with Video Speed Controller</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2023/06/01/solved-microsoft-videos-blank-with-video-speed-controller/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9423</post-id>	</item>
		<item>
		<title>SSH keys with Power Automate&#8217;s SFTP Connector</title>
		<link>https://karl.kranich.org/2023/04/27/ssh-keys-with-power-automates-sftp-connector/</link>
					<comments>https://karl.kranich.org/2023/04/27/ssh-keys-with-power-automates-sftp-connector/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Thu, 27 Apr 2023 18:09:37 +0000</pubDate>
				<category><![CDATA[Power Platform]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=9397</guid>

					<description><![CDATA[<p>Power Automate&#8217;s SFTP connector is very useful for transferring files securely. But it can be finicky to set up SSH private key authentication, especially since every error with the connection is just reported as &#8220;Bad gateway&#8221;. In this post: https://blog.neilsabol.site/post/microsoft-ms-flow-sftp-connector-tips-tricks-errors/, Neil Sabol shares a lot of information about the SFTP connector, including the private key [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2023/04/27/ssh-keys-with-power-automates-sftp-connector/">SSH keys with Power Automate&#8217;s SFTP Connector</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-full"><a href="https://karl.kranich.org/wp-content/uploads/2023/04/sftp-power-automate.png"><img loading="lazy" width="265" height="172" src="https://karl.kranich.org/wp-content/uploads/2023/04/sftp-power-automate.png" alt="" class="wp-image-9398"/></a></figure></div>



<p>Power Automate&#8217;s SFTP connector is very useful for transferring files securely.  But it can be finicky to set up SSH private key authentication, especially since every error with the connection is just reported as &#8220;Bad gateway&#8221;.</p>



<p>In this post: <a href="https://blog.neilsabol.site/post/microsoft-ms-flow-sftp-connector-tips-tricks-errors" target="_blank" rel="noreferrer noopener">https://blog.neilsabol.site/post/microsoft-ms-flow-sftp-connector-tips-tricks-errors</a>/, Neil Sabol shares a lot of information about the SFTP connector, including the private key formats that it accepts.  The part that was still missing for me was how to convert the private key that I&#8217;d generated on my Mac to one that would work with Power Automate.</p>



<p>I created the keypair on my Mac with: <code>ssh-keygen -b 4096 -t rsa</code></p>



<p>This created a private key that started with: <code>-----BEGIN OPENSSH PRIVATE KEY-----</code></p>



<p>This key worked fine with FileZilla, but Power Automate&#8217;s SFTP connection didn&#8217;t like it.  Maybe I could have created a new keypair with a different type after &#8220;-t&#8221;, but I had a working keypair that I wanted to use.</p>



<p>I was able to convert it to a private key acceptable to Power Automate with: <code>ssh-keygen -p -f key-file-name -m pem</code></p>



<p>This results in a private key file that starts with: <code>-----BEGIN RSA PRIVATE KEY-----</code></p>



<p>Copy that whole file and paste it into the &#8220;SSH private key&#8221; field in the Power Automate connection, and it works!</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2023/04/27/ssh-keys-with-power-automates-sftp-connector/">SSH keys with Power Automate&#8217;s SFTP Connector</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2023/04/27/ssh-keys-with-power-automates-sftp-connector/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9397</post-id>	</item>
		<item>
		<title>DocuSign REST API Access from Google Apps Script</title>
		<link>https://karl.kranich.org/2022/05/13/docusign-rest-api-access-from-google-apps-script/</link>
					<comments>https://karl.kranich.org/2022/05/13/docusign-rest-api-access-from-google-apps-script/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sat, 14 May 2022 03:16:05 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=9171</guid>

					<description><![CDATA[<p>For a client project, I needed to call the DocuSign REST API from Google Apps Script. The idea is to attach a script to a Google Spreadsheet that gets a list of completed DocuSign envelope IDs, populates the sheet with information about each envelope, and downloads the combined pdf of the envelope&#8217;s documents to Drive. [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2022/05/13/docusign-rest-api-access-from-google-apps-script/">DocuSign REST API Access from Google Apps Script</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-full"><a href="https://karl.kranich.org/wp-content/uploads/2022/05/eSignature.png"><img loading="lazy" width="400" height="196" src="https://karl.kranich.org/wp-content/uploads/2022/05/eSignature.png" alt="" class="wp-image-9172" srcset="https://karl.kranich.org/wp-content/uploads/2022/05/eSignature.png 400w, https://karl.kranich.org/wp-content/uploads/2022/05/eSignature-300x147.png 300w" sizes="(max-width: 400px) 100vw, 400px" /></a></figure></div>



<p>For a client project, I needed to call the DocuSign REST API from Google Apps Script.  The idea is to attach a script to a Google Spreadsheet that gets a list of completed DocuSign envelope IDs, populates the sheet with information about each envelope, and downloads the combined pdf of the envelope&#8217;s documents to Drive.</p>



<p>DocuSign announced a Google Apps Script library, but I wasn&#8217;t able to obtain access.  However, I discovered that it&#8217;s not difficult to call the API from Apps Script without additional libraries.</p>



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



<p>Every call to the DocuSign REST API requires an access token.  Because the script needs to run without user interaction,  we need to use &#8220;JWT Grant authentication&#8221; to get an access token to send with our requests.  See this page and video for more information about the JWT Grant authentication process: <a href="https://developers.docusign.com/platform/auth/jwt/jwt-get-token/" target="_blank" rel="noreferrer noopener">https://developers.docusign.com/platform/auth/jwt/jwt-get-token/</a></p>



<p>Once I found <a href="https://www.labnol.org/code/json-web-token-201128" target="_blank" rel="noreferrer noopener">Amit Agarwal&#8217;s code</a> to create a JSON Web Token in Google Apps script, the biggest &#8220;gotcha&#8221; was that the RSA private key created in DocuSign needs to be converted into a different form for use in the createJwt function.</p>



<p>I&#8217;ve published some sample code in a github repo: <a href="https://github.com/karlkranich/google-apps-script-docusign" target="_blank" rel="noreferrer noopener">https://github.com/karlkranich/google-apps-script-docusign</a>.  The comments in the files, combined with the DocuSign video linked above, should be a good start towards a functioning Google Apps Script connection to DocuSign.</p>



<figure class="wp-block-image size-full"><a href="https://karl.kranich.org/wp-content/uploads/2022/05/AppsScriptTest.png"><img loading="lazy" width="736" height="687" src="https://karl.kranich.org/wp-content/uploads/2022/05/AppsScriptTest.png" alt="" class="wp-image-9177" srcset="https://karl.kranich.org/wp-content/uploads/2022/05/AppsScriptTest.png 736w, https://karl.kranich.org/wp-content/uploads/2022/05/AppsScriptTest-300x280.png 300w, https://karl.kranich.org/wp-content/uploads/2022/05/AppsScriptTest-624x582.png 624w" sizes="(max-width: 736px) 100vw, 736px" /></a></figure>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2022/05/13/docusign-rest-api-access-from-google-apps-script/">DocuSign REST API Access from Google Apps Script</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2022/05/13/docusign-rest-api-access-from-google-apps-script/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9171</post-id>	</item>
		<item>
		<title>Email Forwarding with Amazon SES</title>
		<link>https://karl.kranich.org/2022/01/30/email-forwarding-with-amazon-ses/</link>
					<comments>https://karl.kranich.org/2022/01/30/email-forwarding-with-amazon-ses/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Mon, 31 Jan 2022 02:38:11 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=9101</guid>

					<description><![CDATA[<p>I&#8217;m using AWS for the domain and web site of my high school alumni association. Hosting a static site on S3 is practically free, so we just end up paying for Route 53. All that was missing was the ability to set up a few incoming email addresses to forward to external addresses. It turns [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2022/01/30/email-forwarding-with-amazon-ses/">Email Forwarding with Amazon SES</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large"><a href="https://karl.kranich.org/wp-content/uploads/2022/01/Email_forwarding_with_SES.png"><img loading="lazy" width="283" height="536" src="https://karl.kranich.org/wp-content/uploads/2022/01/Email_forwarding_with_SES.png" alt="" class="wp-image-9105" srcset="https://karl.kranich.org/wp-content/uploads/2022/01/Email_forwarding_with_SES.png 283w, https://karl.kranich.org/wp-content/uploads/2022/01/Email_forwarding_with_SES-158x300.png 158w" sizes="(max-width: 283px) 100vw, 283px" /></a></figure></div>



<p>I&#8217;m using AWS for the domain and web site of my high school alumni association.  Hosting a static site on S3 is practically free, so we just end up paying for Route 53.</p>



<p>All that was missing was the ability to set up a few incoming email addresses to forward to external addresses.  It turns out that Simple Email Service (SES) doesn&#8217;t offer simple email forwarding.  There&#8217;s an AWS blog <a href="https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/" target="_blank" rel="noreferrer noopener">here</a> that provided the beginning of what I needed:  you set up SES to accept email, write messages to S3, and trigger a Lambda function to send a new email with the original email attached.</p>



<p>The primary limitations of this solution are:</p>



<ol><li>It assumes you want to forward all of your incoming email to a single destination address (or that you&#8217;re willing to set up a Lambda function per destination).  I&#8217;d like the flexibility to set up several forwarders in a single Lambda.</li><li>It assumes you want the original email to be attached as an .eml file.  Since you can&#8217;t open an .eml file in web clients like gmail, that didn&#8217;t work for me.</li></ol>



<p>I made the improvements I needed and published the Lambda code here: <a href="https://github.com/karlkranich/lambda-ses-email-forwarder" target="_blank" rel="noreferrer noopener">https://github.com/karlkranich/lambda-ses-email-forwarder</a>.  If you want to implement it, you&#8217;ll need to follow most of the instructions in the AWS blog to set up SES, S3, and Lambda.  Then just skip the MailRecipient environment variable and instead create a MailAddressMap environment variable that contains a string formatted like this:</p>



<p><code>'[{"from":"fromaddress@example.com","to":"newaddress@gmail.com"},{"from":"fromaddress2@example.com","to":"newaddress2@anotherdomain.com"}]'</code></p>



<p>If you have any trouble getting it working, you should be able to find troubleshooting information in CloudWatch logs.</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2022/01/30/email-forwarding-with-amazon-ses/">Email Forwarding with Amazon SES</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2022/01/30/email-forwarding-with-amazon-ses/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9101</post-id>	</item>
		<item>
		<title>CloudFormation-based S3 Bucket Policies with Conditional Statements and Principals</title>
		<link>https://karl.kranich.org/2021/07/10/cloudformation-based-s3-bucket-policies-with-conditional-statements-and-principals/</link>
					<comments>https://karl.kranich.org/2021/07/10/cloudformation-based-s3-bucket-policies-with-conditional-statements-and-principals/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sat, 10 Jul 2021 21:35:51 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=8986</guid>

					<description><![CDATA[<p>I have a project where I needed to build an S3 bucket policy in a CFT, where certain statements should only be in the policy when a user ARN is provided. It&#8217;s hard to even Google for this use case, since bucket policies can contain &#8220;conditions&#8221;, but that&#8217;s different from conditionally including or excluding a [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2021/07/10/cloudformation-based-s3-bucket-policies-with-conditional-statements-and-principals/">CloudFormation-based S3 Bucket Policies with Conditional Statements and Principals</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large"><a href="https://karl.kranich.org/wp-content/uploads/2021/07/CloudFormation-Bucket-Policy.png"><img loading="lazy" width="209" height="219" src="https://karl.kranich.org/wp-content/uploads/2021/07/CloudFormation-Bucket-Policy.png" alt="" class="wp-image-8987"/></a></figure></div>



<p>I have a project where I needed to build an S3 bucket policy in a CFT, where certain statements should only be in the policy when a user ARN is provided.  It&#8217;s hard to even Google for this use case, since bucket policies can contain &#8220;conditions&#8221;, but that&#8217;s different from conditionally including or excluding a policy statement.</p>



<p>The linked gists contain one extra feature &#8211; if a second user ARN is provided via a parameter, that user is added to one of the policy statements.</p>



<p>I&#8217;ve included json and yml versions.  The yml is much easier to read, but my use case required json, so I&#8217;ve included both: <a href="https://gist.github.com/karlkranich/cd27f8bda64aa9e1cdab6cb52eaafcd8" target="_blank" rel="noreferrer noopener">https://gist.github.com/karlkranich/cd27f8bda64aa9e1cdab6cb52eaafcd8</a></p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2021/07/10/cloudformation-based-s3-bucket-policies-with-conditional-statements-and-principals/">CloudFormation-based S3 Bucket Policies with Conditional Statements and Principals</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2021/07/10/cloudformation-based-s3-bucket-policies-with-conditional-statements-and-principals/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8986</post-id>	</item>
		<item>
		<title>Find Duplicates Across Sheets in Google Spreadsheets</title>
		<link>https://karl.kranich.org/2021/02/15/find-duplicates-across-sheets-in-google-spreadsheets/</link>
					<comments>https://karl.kranich.org/2021/02/15/find-duplicates-across-sheets-in-google-spreadsheets/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Tue, 16 Feb 2021 00:26:07 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=8858</guid>

					<description><![CDATA[<p>Someone reached out and asked if I could adapt my Find Duplicates Apps Script to identify duplicates across all of the sheets in a Google Spreadsheet. Because the requirement is to examine a single column across the sheets, I removed the creation of a temp sheet and used an object to track cell contents and [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2021/02/15/find-duplicates-across-sheets-in-google-spreadsheets/">Find Duplicates Across Sheets in Google Spreadsheets</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://karl.kranich.org/wp-content/uploads/2021/02/Find_Duplicates_Across_Sheets.png"><img loading="lazy" src="https://karl.kranich.org/wp-content/uploads/2021/02/Find_Duplicates_Across_Sheets.png" alt="" class="wp-image-8857" width="362" height="174" srcset="https://karl.kranich.org/wp-content/uploads/2021/02/Find_Duplicates_Across_Sheets.png 482w, https://karl.kranich.org/wp-content/uploads/2021/02/Find_Duplicates_Across_Sheets-300x144.png 300w" sizes="(max-width: 362px) 100vw, 362px" /></a></figure></div>



<p>Someone reached out and asked if I could adapt my <a href="https://karl.kranich.org/2014/02/10/google-apps-script-to-find-duplicates-in-a-google-spreadsheet/" target="_blank" rel="noreferrer noopener">Find Duplicates Apps Script</a> to identify duplicates across all of the sheets in a Google Spreadsheet.  Because the requirement is to examine a single column across the sheets, I removed the creation of a temp sheet and used an object to track cell contents and location.</p>



<p>This example also contains logic to identify similar URLs by ignoring &#8220;https://&#8221;, &#8220;http://&#8221;, leading &#8220;www&#8221;, and trailing &#8220;/&#8221; and query parameters.</p>



<p>The code is <a href="https://gist.github.com/karlkranich/aa2d21aad7edcfda1f802c7d172e6302" target="_blank" rel="noreferrer noopener">here on github</a>.  You can add it to a Google Spreadsheet by choosing Tools &#8211; Script editor and pasting the code in code.gs.  Edit the constants at the beginning that indicate which column to examine and how many header rows to ignore.  Save and close the Script editor.  Reload the spreadsheet, and it will ask for authorization.  You will probably need to reload the spreadsheet one more time before you can run the script.</p>



<p>Here&#8217;s a brief <a href="https://www.youtube.com/watch?v=vUGVGYdRPsI" target="_blank" rel="noreferrer noopener">video demonstration</a>.</p>



<p></p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2021/02/15/find-duplicates-across-sheets-in-google-spreadsheets/">Find Duplicates Across Sheets in Google Spreadsheets</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2021/02/15/find-duplicates-across-sheets-in-google-spreadsheets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8858</post-id>	</item>
		<item>
		<title>Solved: Build failure of Xylophone project in The Complete 2020 Flutter Developer Bootcamp</title>
		<link>https://karl.kranich.org/2020/11/26/solved-build-failure-of-xylophone-project/</link>
					<comments>https://karl.kranich.org/2020/11/26/solved-build-failure-of-xylophone-project/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Thu, 26 Nov 2020 17:28:38 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=8801</guid>

					<description><![CDATA[<p>I&#8217;m really enjoying The Complete 2020 Flutter Development Bootcamp with Dart on Udemy by Angela Yu and London App Brewery. I like how Angela has organized the progression of concepts and challenges. It&#8217;s also easy to skip lectures if you&#8217;re already an experienced programmer and don&#8217;t need to learn concepts like data types and function [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2020/11/26/solved-build-failure-of-xylophone-project/">Solved: Build failure of Xylophone project in The Complete 2020 Flutter Developer Bootcamp</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-full"><img loading="lazy" width="333" height="318" src="https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-app-screenshot.png" alt="" class="wp-image-8802" srcset="https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-app-screenshot.png 333w, https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-app-screenshot-300x286.png 300w" sizes="(max-width: 333px) 100vw, 333px" /></figure></div>



<p>I&#8217;m really enjoying <a href="https://www.udemy.com/course/flutter-bootcamp-with-dart/" target="_blank" rel="noreferrer noopener">The Complete 2020 Flutter Development Bootcamp with Dart</a> on Udemy by Angela Yu and London App Brewery.  I like how Angela has organized the progression of concepts and challenges.  It&#8217;s also easy to skip lectures if you&#8217;re already an experienced programmer and don&#8217;t need to learn concepts like data types and function syntax.</p>



<p>My first big snag came when I added the audioplayers package to the Xylophone project.  The run tab fills up with errors, ending with:</p>



<pre class="wp-block-preformatted">Could not build the application for the simulator.<br>Error launching application on iPhone 12 Pro Max.</pre>



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



<p>Right above that was a bunch of errors like this, which actually sent me down the wrong path investigating this:</p>



<pre class="wp-block-preformatted">warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99. (in target 'Pods-Runner' from project 'Pods')</pre>



<p>Scrolling to the top of the window, I found:</p>



<pre class="wp-block-preformatted">Error output from Xcode build:
â†³
** BUILD FAILED **Xcode's output:
â†³
ld: warning: Could not find or use auto-linked library 'swiftCore'
ld: warning: Could not find or use auto-linked library 'swiftQuartzCore'
ld: warning: Could not find or use auto-linked library 'swiftCoreGraphics'
[lots more like this]</pre>



<p>Googling these messages led to more useful solutions.  The best I found was here: <a href="https://stackoverflow.com/questions/50096025/it-gives-errors-when-using-swift-static-library-with-objective-c-project/50495316#50495316" target="_blank" rel="noreferrer noopener">https://stackoverflow.com/questions/50096025/it-gives-errors-when-using-swift-static-library-with-objective-c-project/50495316#50495316</a>, and I figured it might help someone if I provide updated instructions and a screenshot from Xcode 12.</p>



<h2>The Solution</h2>



<ol><li>Run Xcode</li><li>File &#8211; Open &#8211; [your project]/ios/Runner.xcodeproj</li><li>File &#8211; New &#8211; File</li><li>Select &#8220;Swift File&#8221;, click &#8220;Next&#8221;</li><li>Click &#8220;Create&#8221;</li><li>Click &#8220;Create Bridging Header&#8221;</li><li>Click on &#8220;Runner&#8221; at the top left</li><li>Click &#8220;Build Settings&#8221;</li><li>Change &#8220;Always Embed Swift Standard Libraries&#8221; to &#8220;Yes&#8221;</li><li>Now you can close Xcode and the app should build in Android Studio</li></ol>



<figure class="wp-block-image size-large"><a href="https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode.png"><img loading="lazy" width="1024" height="723" src="https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode-1024x723.png" alt="" class="wp-image-8808" srcset="https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode-1024x723.png 1024w, https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode-300x212.png 300w, https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode-768x542.png 768w, https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode-624x441.png 624w, https://karl.kranich.org/wp-content/uploads/2020/11/xylophone-xcode.png 1133w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2020/11/26/solved-build-failure-of-xylophone-project/">Solved: Build failure of Xylophone project in The Complete 2020 Flutter Developer Bootcamp</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2020/11/26/solved-build-failure-of-xylophone-project/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8801</post-id>	</item>
		<item>
		<title>Serverless Podcast Feed Maintainer and Hosting on AWS</title>
		<link>https://karl.kranich.org/2020/09/25/serverless-podcast/</link>
					<comments>https://karl.kranich.org/2020/09/25/serverless-podcast/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sat, 26 Sep 2020 02:00:30 +0000</pubDate>
				<category><![CDATA[podcast-hosting]]></category>
		<guid isPermaLink="false">https://karl.kranich.org/?p=8752</guid>

					<description><![CDATA[<p>I just finished building a serverless system on AWS that hosts a podcast&#8217;s media files and rss feed, and provides a web interface for managing the rss feed. This is a cost-effective way to host a podcast, and a fun way to learn a bunch of AWS technologies. Overview Here are the elements of the [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2020/09/25/serverless-podcast/">Serverless Podcast Feed Maintainer and Hosting on AWS</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large"><img loading="lazy" width="435" height="250" src="https://karl.kranich.org/wp-content/uploads/2020/09/Podcast-RSS-Project-250.png" alt="" class="wp-image-8694" srcset="https://karl.kranich.org/wp-content/uploads/2020/09/Podcast-RSS-Project-250.png 435w, https://karl.kranich.org/wp-content/uploads/2020/09/Podcast-RSS-Project-250-300x172.png 300w" sizes="(max-width: 435px) 100vw, 435px" /></figure></div>



<p>I just finished building a serverless system on AWS that hosts a podcast&#8217;s media files and rss feed, and provides a web interface for managing the rss feed.</p>



<p>This is a cost-effective way to host a podcast, and a fun way to learn a bunch of AWS technologies.</p>



<h2>Overview</h2>



<p>Here are the elements of the system:</p>



<ul><li>The media files and rss feed file are stored in an S3 bucket that is configured for static site hosting.  The bucket also contains the html, css, and javascript for the feed  maintainer app.</li><li>Podcast and episode info is stored in a DynamoDB table.</li><li>Lambda functions insert episode info into DynamoDB, create presigned URLs for uploading media files, and create the rss feed file whenever episode info is updated.</li><li>API Gateway allows the javascript to PUT episode info to a Lambda function.</li><li>CloudFront allows the static S3 site to be served via https, and redirects http requests to https (not pictured)</li><li>Route53 connects a custom domain name to S3 and CloudFront</li></ul>



<h2>Operation</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" src="https://karl.kranich.org/wp-content/uploads/2020/09/podcast_html.png" alt="" class="wp-image-8759" width="348" height="476" srcset="https://karl.kranich.org/wp-content/uploads/2020/09/podcast_html.png 464w, https://karl.kranich.org/wp-content/uploads/2020/09/podcast_html-219x300.png 219w" sizes="(max-width: 348px) 100vw, 348px" /></figure></div>



<ol><li>The system admin loads podcast info (title, author, etc) into an &#8220;Episode 0&#8221; item in the DynamoDB table.</li><li>The podcast maintainer submits episode information via the html form.</li><li>The podcast-poster Lambda function adds the episode info to the DynamoDB table and returns a presigned URL that allows uploading the media file to S3.</li><li>The S3 upload triggers a Lambda function that updates the rss feed.</li></ol>



<h2>More Info&#8230;</h2>



<p>If there&#8217;s interest, I&#8217;ll outline the steps for setting up the system.  If you want to look at the html, javascript, and lambda functions, refer to these github repositories:</p>



<ul><li><a href="https://github.com/karlkranich/podcast-web" target="_blank" rel="noreferrer noopener">https://github.com/karlkranich/podcast-web</a></li><li><a href="https://github.com/karlkranich/lambda-podcast-poster" target="_blank" rel="noreferrer noopener">https://github.com/karlkranich/lambda-podcast-poster</a></li><li><a href="https://github.com/karlkranich/lambda-rss-builder" target="_blank" rel="noreferrer noopener">https://github.com/karlkranich/lambda-rss-builder</a></li></ul>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2020/09/25/serverless-podcast/">Serverless Podcast Feed Maintainer and Hosting on AWS</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2020/09/25/serverless-podcast/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8752</post-id>	</item>
		<item>
		<title>Installing boto3 for python3 in Cloud9</title>
		<link>https://karl.kranich.org/2019/03/18/installing-boto3-for-python3-in-cloud9/</link>
					<comments>https://karl.kranich.org/2019/03/18/installing-boto3-for-python3-in-cloud9/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Mon, 18 Mar 2019 17:15:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=8480</guid>

					<description><![CDATA[<p>I&#8217;m developing python code in a Cloud9 environment. Tried setting the default python version to 3, but &#8220;python&#8221; still runs python 2. It&#8217;s not a big deal to type &#8220;python3&#8221; each time, but &#8220;pip install boto3&#8221; only installed the module for python 2. Finally, this adaptation of a command I found on stackoverflow worked: python3 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/03/18/installing-boto3-for-python3-in-cloud9/">Installing boto3 for python3 in Cloud9</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;m developing python code in a Cloud9 environment.  Tried setting the default python version to 3, but &#8220;python&#8221; still runs python 2.  It&#8217;s not a big deal to type &#8220;python3&#8221; each time, but &#8220;pip install boto3&#8221; only installed the module for python 2.</p>



<p>Finally, this adaptation of a command I found on stackoverflow worked:</p>



<pre class="wp-block-preformatted">python3 -m pip install --user boto3</pre>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/03/18/installing-boto3-for-python3-in-cloud9/">Installing boto3 for python3 in Cloud9</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2019/03/18/installing-boto3-for-python3-in-cloud9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8480</post-id>	</item>
		<item>
		<title>Switch your Mac&#8217;s online call handler from Skype to Lync</title>
		<link>https://karl.kranich.org/2019/03/07/switch-your-macs-online-call-handler-from-skype-to-lync/</link>
					<comments>https://karl.kranich.org/2019/03/07/switch-your-macs-online-call-handler-from-skype-to-lync/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Fri, 08 Mar 2019 01:29:07 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=8470</guid>

					<description><![CDATA[<p>I had been using Skype for Business as the online call handler for my Mac, but had various problems in online meetings &#8211; sometimes not seeing screen shares, sometimes not seeing chat, sometimes others not seeing my screen share. But when I tried to switch to Lync, it took a while to figure out how [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/03/07/switch-your-macs-online-call-handler-from-skype-to-lync/">Switch your Mac&#8217;s online call handler from Skype to Lync</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright"><a href="https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs.png" target="_blank" rel="noreferrer noopener"><img loading="lazy" width="296" height="300" src="https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs-296x300.png" alt="" class="wp-image-8472" srcset="https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs-296x300.png 296w, https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs-768x778.png 768w, https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs-624x632.png 624w, https://karl.kranich.org/wp-content/uploads/2019/03/lync-prefs.png 958w" sizes="(max-width: 296px) 100vw, 296px" /></a></figure></div>



<p>I had been using Skype for Business as the online call handler for my Mac, but had various problems in online meetings &#8211; sometimes not seeing screen shares, sometimes not seeing chat, sometimes others not seeing my screen share.</p>



<p>But when I tried to switch to Lync, it took a while to figure out how to make &#8220;Join online meeting&#8221; links work &#8211; they kept launching Skype.  Turns out that it&#8217;s simple &#8211; go to Lync Preferences > General tab and change the drop-down settings in the Services section (you can click on the image to expand it).</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/03/07/switch-your-macs-online-call-handler-from-skype-to-lync/">Switch your Mac&#8217;s online call handler from Skype to Lync</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2019/03/07/switch-your-macs-online-call-handler-from-skype-to-lync/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8470</post-id>	</item>
		<item>
		<title>Insert and Delete Cells Google Sheets Add-on is shut down</title>
		<link>https://karl.kranich.org/2019/01/25/insert-and-delete-cells-google-sheets-add-on-is-shut-down/</link>
					<comments>https://karl.kranich.org/2019/01/25/insert-and-delete-cells-google-sheets-add-on-is-shut-down/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Fri, 25 Jan 2019 13:33:52 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=8453</guid>

					<description><![CDATA[<p>If you&#8217;re still using my &#8220;Insert and Delete Cells&#8221; Add-on for Google Sheets, you&#8217;re now seeing: &#8220;401. That&#8217;s an error&#8221;, &#8220;Error: deleted_client&#8221;, and &#8220;The OAuth client was deleted&#8221;. I shut down the &#8220;Insert and Delete Cells&#8221; Google Sheets Add-on yesterday because the functionality has been built into Google Sheets for a few years now. You [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/01/25/insert-and-delete-cells-google-sheets-add-on-is-shut-down/">Insert and Delete Cells Google Sheets Add-on is shut down</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you&#8217;re still using my &#8220;Insert and Delete Cells&#8221; Add-on for Google Sheets, you&#8217;re now seeing: &#8220;401. That&#8217;s an error&#8221;, &#8220;Error: deleted_client&#8221;, and &#8220;The OAuth client was deleted&#8221;.</p>
<p>I shut down the &#8220;Insert and Delete Cells&#8221; Google Sheets Add-on yesterday because the functionality has been built into Google Sheets for a few years now.</p>
<p>You will find the Delete functions in the Edit menu and the Insert functions in the Insert menu.</p>
<p>Sorry for the abrupt shut-down of the Add-on.  I was trying to figure out a graceful way to remove the Add-on from the store, and instead made an irrevocable shut down choice.</p>
<p>I&#8217;m glad the Add-on was useful to people while it lasted!</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2019/01/25/insert-and-delete-cells-google-sheets-add-on-is-shut-down/">Insert and Delete Cells Google Sheets Add-on is shut down</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2019/01/25/insert-and-delete-cells-google-sheets-add-on-is-shut-down/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8453</post-id>	</item>
		<item>
		<title>Solved: Mac option key not working on Nixeus MODA Pro keyboard</title>
		<link>https://karl.kranich.org/2018/02/25/solved-mac-option-key-not-working-nixeus-moda-pro-keyboard/</link>
					<comments>https://karl.kranich.org/2018/02/25/solved-mac-option-key-not-working-nixeus-moda-pro-keyboard/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sun, 25 Feb 2018 19:35:27 +0000</pubDate>
				<category><![CDATA[aha]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[tips&tricks]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6499</guid>

					<description><![CDATA[<p>There are plenty of articles and Youtube videos showing how to switch the Option and Command keys when you adapt a PC keyboard for use on the Mac.Â  (System Prefs &#8211; Keyboard &#8211; Modifier Keys &#8211; Choose the correct keyboard, then switch Command and Option). But even after doing that, the Options key wouldn&#8217;t work.Â  [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2018/02/25/solved-mac-option-key-not-working-nixeus-moda-pro-keyboard/">Solved: Mac option key not working on Nixeus MODA Pro keyboard</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26.jpg"><img loading="lazy" class="alignright size-medium wp-image-6502" src="https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26-300x225.jpg" alt="" width="300" height="225" srcset="https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26-300x225.jpg 300w, https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26-768x576.jpg 768w, https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26-1024x768.jpg 1024w, https://karl.kranich.org/wp-content/uploads/2018/02/2018-02-25-14.32.26-624x468.jpg 624w" sizes="(max-width: 300px) 100vw, 300px" /></a>There are plenty of articles and Youtube videos showing how to switch the Option and Command keys when you adapt a PC keyboard for use on the Mac.Â  (System Prefs &#8211; Keyboard &#8211; Modifier Keys &#8211; Choose the correct keyboard, then switch Command and Option).</p>
<p>But even after doing that, the Options key wouldn&#8217;t work.Â  I finally noticed the &#8220;Win Lk&#8221; light at the top right.Â  Gaming keyboards let you turn off the Windows key in case you accidentally hit it during a game, and that&#8217;s the key that is now mapped to Option for my Mac.</p>
<p>Turning if off just requires holding Fn and pressing F8, which also has a &#8220;no Windows&#8221; symbol.</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2018/02/25/solved-mac-option-key-not-working-nixeus-moda-pro-keyboard/">Solved: Mac option key not working on Nixeus MODA Pro keyboard</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2018/02/25/solved-mac-option-key-not-working-nixeus-moda-pro-keyboard/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6499</post-id>	</item>
		<item>
		<title>iPhone tip: disable the extra click needed to unlock your phone</title>
		<link>https://karl.kranich.org/2016/10/24/iphone-tip-disable-extra-click-needed-unlock-phone/</link>
					<comments>https://karl.kranich.org/2016/10/24/iphone-tip-disable-extra-click-needed-unlock-phone/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Mon, 24 Oct 2016 15:00:58 +0000</pubDate>
				<category><![CDATA[tips&tricks]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6347</guid>

					<description><![CDATA[<p>In a recent iOS update, Apple started requiring an extra click of the home button to unlock your iPhone, instead of just allowing a &#8220;click with finger resting on Touch ID&#8221; to unlock the phone. Â It&#8217;s not a big change, but just different enough to be frustrating. To go back to the original behavior, go [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/10/24/iphone-tip-disable-extra-click-needed-unlock-phone/">iPhone tip: disable the extra click needed to unlock your phone</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright wp-image-6348 size-medium" src="https://karl.kranich.org/wp-content/uploads/2016/10/iphone-touchid-pexels-400-300x300.jpg" alt="iphone-touchid-pexels-400" width="300" height="300" srcset="https://karl.kranich.org/wp-content/uploads/2016/10/iphone-touchid-pexels-400-300x300.jpg 300w, https://karl.kranich.org/wp-content/uploads/2016/10/iphone-touchid-pexels-400-150x150.jpg 150w, https://karl.kranich.org/wp-content/uploads/2016/10/iphone-touchid-pexels-400.jpg 400w" sizes="(max-width: 300px) 100vw, 300px" />In a recent iOS update, Apple started requiring an extra click of the home button to unlock your iPhone, instead of just allowing a &#8220;click with finger resting on Touch ID&#8221; to unlock the phone. Â It&#8217;s not a big change, but just different enough to be frustrating.</p>
<p>To go back to the original behavior, go to Settings &#8211; General &#8211; Accessibility &#8211; Home Button and enable &#8220;Rest Finger to Open&#8221;.</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/10/24/iphone-tip-disable-extra-click-needed-unlock-phone/">iPhone tip: disable the extra click needed to unlock your phone</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/10/24/iphone-tip-disable-extra-click-needed-unlock-phone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6347</post-id>	</item>
		<item>
		<title>How to move a Windows EC2 instance to another AWS account</title>
		<link>https://karl.kranich.org/2016/09/15/move-windows-ec2-instance-another-aws-account/</link>
					<comments>https://karl.kranich.org/2016/09/15/move-windows-ec2-instance-another-aws-account/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Fri, 16 Sep 2016 01:37:30 +0000</pubDate>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6337</guid>

					<description><![CDATA[<p>Here are the steps that I&#8217;ve used to move some Windows ServerÂ EC2 instances to a different AWS account. Â This method should work for any OS, but I&#8217;ve only tested with Server 2008 R2. The simple version: In the source account, stop the instance Make a snapshot of the instance&#8217;s system volume Share the snapshot with [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/09/15/move-windows-ec2-instance-another-aws-account/">How to move a Windows EC2 instance to another AWS account</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright size-full wp-image-6338" src="https://karl.kranich.org/wp-content/uploads/2016/09/ec2-icon.png" alt="ec2-icon" width="293" height="293" srcset="https://karl.kranich.org/wp-content/uploads/2016/09/ec2-icon.png 293w, https://karl.kranich.org/wp-content/uploads/2016/09/ec2-icon-150x150.png 150w" sizes="(max-width: 293px) 100vw, 293px" />Here are the steps that I&#8217;ve used to move some Windows ServerÂ EC2 instances to a different AWS account. Â This method should work for any OS, but I&#8217;ve only tested with Server 2008 R2.</p>
<p>The simple version:</p>
<ol>
<li>In the source account, stop the instance</li>
<li>Make a snapshot of the instance&#8217;s system volume</li>
<li>Share the snapshot with the destination account number</li>
<li>In the destination account, make a volume from the snapshot</li>
<li>Create an instance with the same OS as the source instance</li>
<li>Detach and delete the new instance&#8217;s system volume</li>
<li>Attach the volume from step 4</li>
<li>Start the instance</li>
</ol>
<p>The detailed version:</p>
<p><span id="more-6337"></span></p>
<ol>
<li>In the source AWS account, stop the instance</li>
<li>Go to Volumes, search for your instance name or ID, choose the volume, and click Actions &#8211; Create Snapshot. Â Note the Snapshot ID.</li>
<li>Wait for the creation to finish, then click Permissions in the bottom pane and share with the destination account number (get it from the destination account by clicking on your username in the header and choosing &#8220;My Account&#8221;)</li>
<li>In the destination AWS account, go to Snapshots. Â Change the drop-down to &#8220;Private Snapshots&#8221;. Search for the Snapshot ID, select it, and click Action &#8211; Create Volume. Â The default settings should be OK. Â Click Create. Â Note the Volume ID.</li>
<li>Create an instance. Â I don&#8217;t know any way to create one without launching, so launch it and then stop it.</li>
<li>Go to Volumes, search for your instance name or ID, choose the volume, and note where it is attached (most likely /dev/sda1). Â Click Actions &#8211; Detach, then Actions &#8211; Delete Volume.</li>
<li>Search for the volume created in step 4 and choose it. Â Click Actions &#8211; Attach Volume. Â Fill in t the instance ID (you can search by name) and Device path from step 6 (most likely /dev/sda1). Â Ignore the note about xvdf &#8211; xvdp.</li>
<li>Start the instance</li>
</ol>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/09/15/move-windows-ec2-instance-another-aws-account/">How to move a Windows EC2 instance to another AWS account</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/09/15/move-windows-ec2-instance-another-aws-account/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6337</post-id>	</item>
		<item>
		<title>Ultimate Guide to Google Sheets</title>
		<link>https://karl.kranich.org/2016/07/29/ultimate-guide-google-sheets/</link>
					<comments>https://karl.kranich.org/2016/07/29/ultimate-guide-google-sheets/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Fri, 29 Jul 2016 13:04:14 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[tips&tricks]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6328</guid>

					<description><![CDATA[<p>Zapier has published a free ebook called The Ultimate Guide to Google Sheets, and it mentions my &#8220;Insert and Delete Cells&#8221; Sheets Add-on! The book takes readers first through a detailed Google Sheets tutorial, then dives into deeper features that help readers build their own custom tools and apps using Google Sheets&#8217; most powerful features. [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/07/29/ultimate-guide-google-sheets/">Ultimate Guide to Google Sheets</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright wp-image-6329 size-medium" src="https://karl.kranich.org/wp-content/uploads/2016/07/zapier-sheets-guide-231x300.png" alt="zapier-sheets-guide" width="231" height="300" srcset="https://karl.kranich.org/wp-content/uploads/2016/07/zapier-sheets-guide-231x300.png 231w, https://karl.kranich.org/wp-content/uploads/2016/07/zapier-sheets-guide.png 500w" sizes="(max-width: 231px) 100vw, 231px" />Zapier has published a free ebook called <em>The Ultimate Guide to Google Sheets</em>, and it mentions my <a href="https://chrome.google.com/webstore/detail/insert-and-delete-cells/fnpojobhpldojabbdcoajjmboaallcmk?hl=en" target="_blank">&#8220;Insert and Delete Cells&#8221; Sheets Add-on</a>!</p>
<div>
<p>The book takes readers first through a detailed Google Sheets tutorial, then dives into deeper features that help readers build their own custom tools and apps using Google Sheets&#8217; most powerful features.</p>
<p>Here are links to the book:</p>
<p>&#8211; Zapier Learning Center:Â <a href="https://zapier.com/learn/google-sheets/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://zapier.com/learn/google-sheets/&amp;source=gmail&amp;ust=1469840767449000&amp;usg=AFQjCNFfEEnev1o0XcEoCRSfRauLpZkHIQ">https://zapier.com/<wbr />learn/google-sheets/</a><br />
&#8211; Kindle store:Â <a href="https://www.amazon.com/Ultimate-Guide-Google-Sheets-spreadsheet-ebook/dp/B01IMV1NH2/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://www.amazon.com/Ultimate-Guide-Google-Sheets-spreadsheet-ebook/dp/B01IMV1NH2/&amp;source=gmail&amp;ust=1469840767449000&amp;usg=AFQjCNEN7LWsgUVHPCKk9HsPrzuVbOu-4Q">https://www.amazon.com/<wbr />Ultimate-Guide-Google-Sheets-<wbr />spreadsheet-ebook/dp/<wbr />B01IMV1NH2/</a><br />
&#8211; iBooks store:Â <a href="https://itunes.apple.com/us/book/ultimate-guide-to-google-sheets/id1135333631" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://itunes.apple.com/us/book/ultimate-guide-to-google-sheets/id1135333631&amp;source=gmail&amp;ust=1469840767449000&amp;usg=AFQjCNG8Mi6DQFwO_wguARU3ZwZkUnd4Fw">https://itunes.apple.<wbr />com/us/book/ultimate-guide-to-<wbr />google-sheets/id1135333631</a></p>
</div>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/07/29/ultimate-guide-google-sheets/">Ultimate Guide to Google Sheets</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/07/29/ultimate-guide-google-sheets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6328</post-id>	</item>
		<item>
		<title>Sheets API access with PHP part 5: Querying rows</title>
		<link>https://karl.kranich.org/2016/03/05/sheets-api-access-php-part-5-querying-rows/</link>
					<comments>https://karl.kranich.org/2016/03/05/sheets-api-access-php-part-5-querying-rows/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sun, 06 Mar 2016 01:24:52 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6186</guid>

					<description><![CDATA[<p>The Google Spreadsheets API allows you to send simple queries to retrieve subsets of the rows in your sheetÂ -Â it&#8217;s as easy as appending the query to the end of the URL. For example, if I have a column called &#8220;Quantity&#8221; and want rows with Quantity greater than 9, I would append ?sq=quantity&#62;9 to the end [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/03/05/sheets-api-access-php-part-5-querying-rows/">Sheets API access with PHP part 5: Querying rows</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright size-full wp-image-6187" src="https://karl.kranich.org/wp-content/uploads/2016/03/query-rows.jpg" alt="query-rows" width="368" height="174" srcset="https://karl.kranich.org/wp-content/uploads/2016/03/query-rows.jpg 368w, https://karl.kranich.org/wp-content/uploads/2016/03/query-rows-300x142.jpg 300w" sizes="(max-width: 368px) 100vw, 368px" />The Google Spreadsheets API allows you to send simple queries to retrieve subsets of the rows in your sheetÂ -Â it&#8217;s as easy as appending the query to the end of the URL.</p>
<p>For example, if I have a column called &#8220;Quantity&#8221; and want rows with Quantity greater than 9, I would append <strong>?sq=quantity&gt;9</strong> to the end of the URL and issue the GET request (don&#8217;t forget that column names are always converted to lowercase and spaces are removed).</p>
<p>The other method is to add the sq query parameter to the GuzzleÂ $httpClient. Â I&#8217;ve illustrated this in my <a href="https://gist.github.com/karlkranich/de225928665dc6b83667" target="_blank">example code</a>.</p>
<p>See <a href="https://developers.google.com/google-apps/spreadsheets/data#send_a_structured_query_for_rows" target="_blank">this page</a> for more info.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/03/05/sheets-api-access-php-part-5-querying-rows/">Sheets API access with PHP part 5: Querying rows</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/03/05/sheets-api-access-php-part-5-querying-rows/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6186</post-id>	</item>
		<item>
		<title>SNI with Rackspace Load Balancers: racklb.sh script</title>
		<link>https://karl.kranich.org/2016/03/03/sni-rackspace-load-balancers-racklb-sh-script/</link>
					<comments>https://karl.kranich.org/2016/03/03/sni-rackspace-load-balancers-racklb-sh-script/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Fri, 04 Mar 2016 00:55:57 +0000</pubDate>
				<category><![CDATA[tips&tricks]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6180</guid>

					<description><![CDATA[<p>The Rackspace web dashboard allows you to attach a certificate and private key to a cloud load balancer for ssl offloading. Â But even though the load balancers support SNI and multiple certificates, neither the web console nor the &#8220;rack&#8221; command line scripts expose this functionality. If you want to attach additionalÂ certificates to a load balancer [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/03/03/sni-rackspace-load-balancers-racklb-sh-script/">SNI with Rackspace Load Balancers: racklb.sh script</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright size-full wp-image-6181" src="https://karl.kranich.org/wp-content/uploads/2016/03/CLB.png" alt="CLB" width="178" height="155" />The Rackspace web dashboard allows you to attach a certificate and private key to a cloud load balancer for ssl offloading. Â But even though the load balancers support SNI and multiple certificates, neither the web console nor the &#8220;rack&#8221; command line scripts expose this functionality.</p>
<p>If you want to attach additionalÂ certificates to a load balancer from the command line, check out racklb.sh atÂ <a href="https://github.com/karlkranich/racklb" target="_blank">https://github.com/karlkranich/racklb</a>. Â The script doesn&#8217;t do a lot yet, but does the two things that I miss most from the web console:</p>
<ol>
<li>Expose the private (ServiceNet) address of a load balancer</li>
<li>Manipulate the certificate mappings</li>
</ol>
<p>To get started with it, clone the repo and check out the readme and &#8220;racklb.sh -h&#8221;</p>
<p>Thanks to Adam Bull at <a href="http://www.haxed.me.uk" target="_blank">www.haxed.me.uk</a> for the inspiration and sed magic in this script!</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/03/03/sni-rackspace-load-balancers-racklb-sh-script/">SNI with Rackspace Load Balancers: racklb.sh script</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/03/03/sni-rackspace-load-balancers-racklb-sh-script/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6180</post-id>	</item>
		<item>
		<title>Solved: cURL error 60 with Sheets API access from Windows</title>
		<link>https://karl.kranich.org/2016/02/21/sheets-api-access-from-windows-curl-error-60/</link>
					<comments>https://karl.kranich.org/2016/02/21/sheets-api-access-from-windows-curl-error-60/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Mon, 22 Feb 2016 00:56:27 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6165</guid>

					<description><![CDATA[<p>It turns out thatÂ my Google Sheets API instructions don&#8217;t work right away on Windows. Â People running WAMP or XAMPP have been reporting &#8220;cURL error 60: SSL certificate problem: unable to get local issuer certificate&#8221;. For some reason, cURL on Windows doesn&#8217;t come with a certificate bundle, so it can&#8217;t verify Google&#8217;s certificate to establish a [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/02/21/sheets-api-access-from-windows-curl-error-60/">Solved: cURL error 60 with Sheets API access from Windows</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright size-full wp-image-6166" src="https://karl.kranich.org/wp-content/uploads/2016/02/Broken_Lock_Curl.png" alt="Broken_Lock_Curl" width="250" height="253" />It turns out thatÂ my <a href="https://karl.kranich.org/2015/04/16/google-sheets-api-php/">Google Sheets API instructions</a> don&#8217;t work right away on Windows. Â People running WAMP or XAMPP have been reporting &#8220;cURL error 60: SSL certificate problem: unable to get local issuer certificate&#8221;.</p>
<p>For some reason, cURL on Windows doesn&#8217;t come with a certificate bundle, so it can&#8217;t verify Google&#8217;s certificate to establish a TLS/SSL connection. Â There are many articles out there making it sound really simple &#8212; just</p>
<ol>
<li>download a cacert.pem file</li>
<li>add a line to your php.ini file: &#8220;curl.cainfo =Â <em>path to cacert file</em>&#8220;</li>
</ol>
<p>But it took me hours to work out the details. Â First, the cacert.pem file that most people point you to (atÂ curl.haxx.se/docs/caextract.html) didn&#8217;t work for me. Â After a while, I found that the cacert.pem from Shane Stebner atÂ <a href="http://flwebsites.biz/posts/how-fix-curl-error-60-ssl-issue" target="_blank">flwebsites.biz/posts/how-fix-curl-error-60-ssl-issue</a> made all the difference. Â I haven&#8217;t figured out why.</p>
<p>Second, note that there are at least two php.info files on your system: Â one for running php from the command line (mine is C:\wamp\bin\php\php5.5.12\php.ini), and another for when php is called by Apache (for me, that&#8217;sÂ C:\wamp\bin\apache\apache2.4.9\bin\php.ini). Â Since I&#8217;m running php from the command line, I only edited the first one.</p>
<p>I saved the cacert.pem file in c:\wamp and added this to my php.ini: curl.cainfo = c:\wamp\cacert.pem. Â It didn&#8217;t matter which kind of slashes I used.</p>
<p>Hope this helps a few people start accessing Google Sheets with PHP!</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/02/21/sheets-api-access-from-windows-curl-error-60/">Solved: cURL error 60 with Sheets API access from Windows</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/02/21/sheets-api-access-from-windows-curl-error-60/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6165</post-id>	</item>
		<item>
		<title>Sheets API access with PHP part 4: Editing Cells</title>
		<link>https://karl.kranich.org/2016/01/16/sheets-api-access-with-php-part-4-editing-cells/</link>
					<comments>https://karl.kranich.org/2016/01/16/sheets-api-access-with-php-part-4-editing-cells/#respond</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sat, 16 Jan 2016 20:29:48 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6125</guid>

					<description><![CDATA[<p>Here&#8217;s how to get up to speed with the Google Sheets cell-based feed and PHP. My previous posts have illustrated the use of Google&#8217;s PHP API client to interact with Google Sheets using list-based feeds. Â This method is ideal for reading from and writing to spreadsheets that have a single header row, but isn&#8217;t useful [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/01/16/sheets-api-access-with-php-part-4-editing-cells/">Sheets API access with PHP part 4: Editing Cells</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignright size-full wp-image-6127" src="https://karl.kranich.org/wp-content/uploads/2016/01/cellfeed.jpg" alt="cellfeed" width="450" height="184" srcset="https://karl.kranich.org/wp-content/uploads/2016/01/cellfeed.jpg 450w, https://karl.kranich.org/wp-content/uploads/2016/01/cellfeed-300x123.jpg 300w" sizes="(max-width: 450px) 100vw, 450px" />Here&#8217;s how to get up to speed with the Google Sheets cell-based feed and PHP.</p>
<p>My <a href="https://karl.kranich.org/category/google-apps/" target="_blank">previous posts</a> have illustrated the use of Google&#8217;s PHP API client to interact with Google Sheets using list-based feeds. Â This method is ideal for reading from and writing to spreadsheets that have a single header row, but isn&#8217;t useful for more complicated sheets.</p>
<p>The cell-based feed allows individual cells to be read and written. Â I&#8217;ve written some example PHP code that implements the cell-based feed methods to help get you up to speed a little quicker. Â Google documentation is <a href="https://developers.google.com/google-apps/spreadsheets/data#work_with_cell-based_feeds" target="_blank">here</a>.</p>
<p>To start, follow the steps in <a href="https://karl.kranich.org/2015/04/16/google-sheets-api-php/" target="_blank">this post</a> to set up your service account, share a spreadsheet, and install the API client. Â Then you should be able to adapt my <a href="https://gist.github.com/karlkranich/afa39e3d778455b38c38" target="_blank">example code</a> to interact with your spreadsheet.</p>
<p>Please let me know if you have any comments or questions!</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/01/16/sheets-api-access-with-php-part-4-editing-cells/">Sheets API access with PHP part 4: Editing Cells</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/01/16/sheets-api-access-with-php-part-4-editing-cells/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6125</post-id>	</item>
		<item>
		<title>Parsing Google Sheets data with PHP&#8217;s SimpleXML</title>
		<link>https://karl.kranich.org/2016/01/10/parsing-google-sheets-data-with-phps-simplexml/</link>
					<comments>https://karl.kranich.org/2016/01/10/parsing-google-sheets-data-with-phps-simplexml/#comments</comments>
		
		<dc:creator><![CDATA[karl.kranich]]></dc:creator>
		<pubDate>Sun, 10 Jan 2016 22:24:27 +0000</pubDate>
				<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://karl.kranich.org/?p=6115</guid>

					<description><![CDATA[<p>AKA:Â Sheets API access with PHP part 3 Continuing my series on using PHP to manipulate Google Spreadsheets, I&#8217;ve added a section to my code that reads the XML representation of a spreadsheet and then parses out the rows and columns. Â Note that whenever you&#8217;re working with list-based feeds, we&#8217;re assuming that the first row contains [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/01/10/parsing-google-sheets-data-with-phps-simplexml/">Parsing Google Sheets data with PHP&#8217;s SimpleXML</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><img loading="lazy" class="alignright size-full wp-image-6116" src="https://karl.kranich.org/wp-content/uploads/2016/01/SimpleXML.jpg" alt="SimpleXML" width="400" height="277" srcset="https://karl.kranich.org/wp-content/uploads/2016/01/SimpleXML.jpg 400w, https://karl.kranich.org/wp-content/uploads/2016/01/SimpleXML-300x208.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" />AKA:Â Sheets API access with PHP part 3</h3>
<p>Continuing my series on using PHP to manipulate Google Spreadsheets, I&#8217;ve added a section to <a href="https://gist.github.com/karlkranich/de225928665dc6b83667" target="_blank">my code</a> that reads the XML representation of a spreadsheet and then parses out the rows and columns. Â Note that whenever you&#8217;re working with list-based feeds, we&#8217;re assuming that the first row contains column headings.</p>
<p>Using SimpleXML, it wasn&#8217;t difficult to parse out the cell data. Â The biggest hurdle was learning about XML namespaces &#8212; at first, I thought that the XML had tags like &#8220;gd:etag&#8221; or &#8220;gsx:quantity&#8221; and had to learn that gd and gsx were namespaces. Â In SimpleXML, several of the methods take a namespace as a parameter. Â You can specify the prefix or namespace URL as described in the doc for the children method <a href="http://php.net/manual/en/simplexmlelement.children.php" target="_blank">here</a>.</p>
<p>I think it&#8217;s also possible to get the spreadsheet data as json, but I haven&#8217;t tried that yet.</p>
<p>The post <a rel="nofollow" href="https://karl.kranich.org/2016/01/10/parsing-google-sheets-data-with-phps-simplexml/">Parsing Google Sheets data with PHP&#8217;s SimpleXML</a> appeared first on <a rel="nofollow" href="https://karl.kranich.org">Karl&#039;s Place</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://karl.kranich.org/2016/01/10/parsing-google-sheets-data-with-phps-simplexml/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6115</post-id>	</item>
	</channel>
</rss>
