How to move a Windows EC2 instance to another AWS account

ec2-iconHere are the steps that I’ve used to move some Windows Server EC2 instances to a different AWS account.  This method should work for any OS, but I’ve only tested with Server 2008 R2.

The simple version:

  1. In the source account, stop the instance
  2. Make a snapshot of the instance’s system volume
  3. Share the snapshot with the destination account number
  4. In the destination account, make a volume from the snapshot
  5. Create an instance with the same OS as the source instance
  6. Detach and delete the new instance’s system volume
  7. Attach the volume from step 4
  8. Start the instance

The detailed version:

Continue reading

Ultimate Guide to Google Sheets

zapier-sheets-guideZapier has published a free ebook called The Ultimate Guide to Google Sheets, and it mentions my “Insert and Delete Cells” 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’ most powerful features.

Here are links to the book:

– Zapier Learning Center: https://zapier.com/learn/google-sheets/
– Kindle store: https://www.amazon.com/Ultimate-Guide-Google-Sheets-spreadsheet-ebook/dp/B01IMV1NH2/
– iBooks store: https://itunes.apple.com/us/book/ultimate-guide-to-google-sheets/id1135333631

Sheets API access with PHP part 5: Querying rows

query-rowsThe Google Spreadsheets API allows you to send simple queries to retrieve subsets of the rows in your sheet – it’s as easy as appending the query to the end of the URL.

For example, if I have a column called “Quantity” and want rows with Quantity greater than 9, I would append ?sq=quantity>9 to the end of the URL and issue the GET request (don’t forget that column names are always converted to lowercase and spaces are removed).

The other method is to add the sq query parameter to the Guzzle $httpClient.  I’ve illustrated this in my example code.

See this page for more info.

 

SNI with Rackspace Load Balancers: racklb.sh script

CLBThe 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 “rack” command line scripts expose this functionality.

If you want to attach additional certificates to a load balancer from the command line, check out racklb.sh at https://github.com/karlkranich/racklb.  The script doesn’t do a lot yet, but does the two things that I miss most from the web console:

  1. Expose the private (ServiceNet) address of a load balancer
  2. Manipulate the certificate mappings

To get started with it, clone the repo and check out the readme and “racklb.sh -h”

Thanks to Adam Bull at www.haxed.me.uk for the inspiration and sed magic in this script!

Solved: cURL error 60 with Sheets API access from Windows

Broken_Lock_CurlIt turns out that my Google Sheets API instructions don’t work right away on Windows.  People running WAMP or XAMPP have been reporting “cURL error 60: SSL certificate problem: unable to get local issuer certificate”.

For some reason, cURL on Windows doesn’t come with a certificate bundle, so it can’t verify Google’s certificate to establish a TLS/SSL connection.  There are many articles out there making it sound really simple — just

  1. download a cacert.pem file
  2. add a line to your php.ini file: “curl.cainfo = path to cacert file

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’t work for me.  After a while, I found that the cacert.pem from Shane Stebner at flwebsites.biz/posts/how-fix-curl-error-60-ssl-issue made all the difference.  I haven’t figured out why.

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’s C:\wamp\bin\apache\apache2.4.9\bin\php.ini).  Since I’m running php from the command line, I only edited the first one.

I saved the cacert.pem file in c:\wamp and added this to my php.ini: curl.cainfo = c:\wamp\cacert.pem.  It didn’t matter which kind of slashes I used.

Hope this helps a few people start accessing Google Sheets with PHP!

Sheets API access with PHP part 4: Editing Cells

cellfeedHere’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’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’t useful for more complicated sheets.

The cell-based feed allows individual cells to be read and written.  I’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 here.

To start, follow the steps in this post to set up your service account, share a spreadsheet, and install the API client.  Then you should be able to adapt my example code to interact with your spreadsheet.

Please let me know if you have any comments or questions!

Parsing Google Sheets data with PHP’s SimpleXML

SimpleXMLAKA: Sheets API access with PHP part 3

Continuing my series on using PHP to manipulate Google Spreadsheets, I’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’re working with list-based feeds, we’re assuming that the first row contains column headings.

Using SimpleXML, it wasn’t difficult to parse out the cell data.  The biggest hurdle was learning about XML namespaces — at first, I thought that the XML had tags like “gd:etag” or “gsx:quantity” 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 here.

I think it’s also possible to get the spreadsheet data as json, but I haven’t tried that yet.

Solved: How to Map a Drive from Windows 10 to OS X 10.10.5 Yosemite Server

local-security-policyWe have an increasing number of Windows 10 machines in our office, and realized that we couldn’t get them to connect to shares on our OS X 10.10.5 (Yosemite) server.  We have a bunch of Local Network Users, and had no problem connecting as them from Windows 7 machines.  But Windows 10 machines would just pop up the authentication dialog again with the message “The specified network password is not correct”.

I tried all of the Local Security Policy changes that people have mentioned on the ‘net, and nothing worked.  I finally came across somebody mentioning that you have to put the server NetBIOS Name in ALL CAPS when you authenticate.  So, in our case, we needed to make one Local Security Policy change on the Windows 10 clients and put the server name in all caps when authenticating.

Details below:
Continue reading

Google Updates PHP API Client

new-improvedYesterday I updated my example PHP code for manipulating Google Spreadsheets with the Google-provided PHP API client.  If you tried getting it to work recently and were frustrated, take another look.  Google made major changes to the client that required changing my code.

Very soon I hope to figure out and demonstrate Google’s new Execution API, which lets you write Google Apps Script (javascript) which is called by your web apps.  This would allow for much more power manipulation of Google Sheets (and other docs) from web code.

Create a Video DVD with DVD Flick

Every once in a while I need to create a video DVD that will work in a standard DVD player.  With Windows 10, Microsoft no longer provides Windows DVD Maker, so I needed to find a replacement.

DVD Flick does the job quickly and easily.  It’s simple to add titles (individual videos), add regularly spaced chapters (so you can skip forward and back a few minutes at a time), and burn a DVD with a simple menu.

Here’s a 2-minute demonstration: