<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Ramblings of an Eggplant</title><link href="https://mtu.net/~jpschewe/blog/" rel="alternate"/><link href="https://mtu.net/~jpschewe/blog/feeds/all.atom.xml" rel="self"/><id>https://mtu.net/~jpschewe/blog/</id><updated>2023-02-13T07:04:00-06:00</updated><entry><title>X2Go compositing issues</title><link href="https://mtu.net/~jpschewe/blog/2023/02/225/" rel="alternate"/><published>2023-02-13T07:04:00-06:00</published><updated>2023-02-13T07:04:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2023-02-13:/~jpschewe/blog/2023/02/225/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I use &lt;a href="https://wiki.x2go.org/doku.php"&gt;X2Go&lt;/a&gt; to login to some of my systems when I need to access a graphical desktop. To keep the load on the system low I use &lt;a href="https://www.xfce.org/"&gt;XFCE&lt;/a&gt; as the desktop environment. Recently I found that when I logged into one of my systems running Ubuntu 22.04 that …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I use &lt;a href="https://wiki.x2go.org/doku.php"&gt;X2Go&lt;/a&gt; to login to some of my systems when I need to access a graphical desktop. To keep the load on the system low I use &lt;a href="https://www.xfce.org/"&gt;XFCE&lt;/a&gt; as the desktop environment. Recently I found that when I logged into one of my systems running Ubuntu 22.04 that applications didn't appear to want to launch. When checking top in a terminal on the remote system I found x2goagent at 100% CPU. After a couple of attempts I came across &lt;a href="https://www.mail-archive.com/search?l=debian-user@lists.debian.org&amp;amp;q=subject:%22Re%5C%3A+x2goagent%5C%3A+high+CPU+load+with+Xfce+4.16%22&amp;amp;o=newest&amp;amp;f=1"&gt;this post&lt;/a&gt; on the a Debian users mailing list that solved my problem.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;p&gt;Setting "use_compositing" to "false" in
&lt;code&gt;~/.config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml&lt;/code&gt;
solved the issue.&lt;/p&gt;</content><category term="Blog"/><category term="Today I Learned"/></entry><entry><title>GitHub pull requests and issues</title><link href="https://mtu.net/~jpschewe/blog/2023/02/github-pull-requests-and-issues/" rel="alternate"/><published>2023-02-10T18:34:00-06:00</published><updated>2023-02-10T18:34:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2023-02-10:/~jpschewe/blog/2023/02/github-pull-requests-and-issues/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I have resisted using pull requests on GitHub for my own repositories because it seemed like I need to have have both an Issue and a Pull Request for each branch. I create Issues for fixes and features that I want to implement. During development I create a branch for …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I have resisted using pull requests on GitHub for my own repositories because it seemed like I need to have have both an Issue and a Pull Request for each branch. I create Issues for fixes and features that I want to implement. During development I create a branch for the Issue and then once it's finished and tested I manually merge with a merge commit and use the message of the merge commit to close the Issue.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Recently I came across an article about converting a &lt;a href="https://jtway.co/convert-github-issue-to-pull-request-c624834835d8" rel="noreferrer noopener" target="_blank"&gt;GitHub Issue to a Pull Request&lt;/a&gt;. This solved my issue of having both an Issue and a Pull Request for each feature. I can create my Issues like normal and create a branch. Then when I push the branch I execute the following:&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;hub pull-request -i &amp;lt;issue number&amp;gt; -b main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;This converts the specified Issue number into a Pull Request and associates it with the current branch. I need the "-b main" because I have my push.default value set to "nothing" and it appears that "hub" can't find the main branch with that setup.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I've found a couple of benefits of using this pattern. One is that I can merge pull requests using the &lt;a href="https://github.com/mobile" rel="noreferrer noopener" target="_blank"&gt;GitHub mobile app&lt;/a&gt; on my phone. The other is that now it's really easy to review the changes made for a feature and keep the discussion about the issue in the same place.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="Blog"/><category term="GitHub"/><category term="Today I Learned"/></entry><entry><title>Using password protected zip files in Mac</title><link href="https://mtu.net/~jpschewe/blog/2022/02/using-password-protected-zip-files-in-mac/" rel="alternate"/><published>2022-02-10T20:51:00-06:00</published><updated>2022-02-10T20:51:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2022-02-10:/~jpschewe/blog/2022/02/using-password-protected-zip-files-in-mac/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;In an earlier post I explained &lt;a href="https://mtu.net/~jpschewe/blog/2020/11/using-password-protected-zip-files/" data-type="post" data-id="195"&gt;how to use password protected zip&lt;/a&gt; files in Windows. This post is the Mac version. 7-Zip is still the file format, however the application is Keka instead of 7-Zip. This is because the 7-Zip application for Mac is command line only and therefore not …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;In an earlier post I explained &lt;a href="https://mtu.net/~jpschewe/blog/2020/11/using-password-protected-zip-files/" data-type="post" data-id="195"&gt;how to use password protected zip&lt;/a&gt; files in Windows. This post is the Mac version. 7-Zip is still the file format, however the application is Keka instead of 7-Zip. This is because the 7-Zip application for Mac is command line only and therefore not quite as user-friendly.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Install Keka&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Download Keka from &lt;a href="https://www.keka.io"&gt;https://www.keka.io&lt;/a&gt; or the Mac App store.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;If you downloaded the file from, do the standard Mac thing and open the dmg file and drag the application to the Applications folder.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Creating a password protected file&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Start by putting the files that you want to send in a folder by themselves, even if it’s only a single file. This makes it easy to keep track of what is being sent. It also helps the recipient as they will get the same folder name when they uncompress the file.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Open Keka. Specify 7Z and enter a password&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":213,"sizeSlug":"full","linkDestination":"media"} --&gt;

&lt;figure class="wp-block-image size-full"&gt;
&lt;a href="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.07-PM.png"&gt;&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.07-PM.png" class="wp-image-213" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Drag and drop the folder onto the window&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":214,"sizeSlug":"full","linkDestination":"media"} --&gt;

&lt;figure class="wp-block-image size-full"&gt;
&lt;a href="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.26-PM.png"&gt;&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.26-PM.png" class="wp-image-214" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Pick filename&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":215,"sizeSlug":"full","linkDestination":"media"} --&gt;

&lt;figure class="wp-block-image size-full"&gt;
&lt;a href="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.49-PM.png"&gt;&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.30.49-PM.png" class="wp-image-215" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Click Compress&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Attach this file to an email and send it with a simple message. DO NOT PUT THE PASSWORD IN THE EMAIL. Contact the recipient through another means, phone, text, encrypted chat (WhatsApp) to send the password.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Opening a password protected file&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The recipient saves the file to their computer. You will need to pay attention to where the file is saved. It might be in Documents, it might be in Downloads or some other location depending on your email client.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Open Finder and navigate to where the file is saved. Right click on 7z file -&amp;gt; Open With Keka. Don't double click on the file to open it. This will use the built-in Mac utility that doesn't understand the encryption on the file. You will be prompted for a password, but it'll never work.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":216,"sizeSlug":"large","linkDestination":"media"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;a href="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.32.15-PM.png"&gt;&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2022/02/Screen-Shot-2022-02-10-at-8.32.15-PM-1024x544.png" class="wp-image-216" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Pick a location. Click Extract. You will then be prompted to enter the password. When it finishes you will have a folder with the files that were sent.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</content><category term="Blog"/><category term="password zip file"/><category term="mac"/></entry><entry><title>Using password protected zip files in windows</title><link href="https://mtu.net/~jpschewe/blog/2020/11/using-password-protected-zip-files/" rel="alternate"/><published>2020-11-17T21:35:00-06:00</published><updated>2020-11-17T21:35:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2020-11-17:/~jpschewe/blog/2020/11/using-password-protected-zip-files/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Creating zip files with a password is a fairly easy way to add some security to information that you are sending via email. It's not really good encryption, but it will keep many people out.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I suggest using &lt;a href="https://www.7-zip.org/"&gt;7-Zip&lt;/a&gt;. It's an open-source and free application that runs on Windows, Linux …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Creating zip files with a password is a fairly easy way to add some security to information that you are sending via email. It's not really good encryption, but it will keep many people out.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I suggest using &lt;a href="https://www.7-zip.org/"&gt;7-Zip&lt;/a&gt;. It's an open-source and free application that runs on Windows, Linux and Mac. 7-zip has some better password encryption options than the zip programs built into some operating systems. This does mean that both the sender and recipient need to install 7-Zip, but I think it's worth it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;If you are on a Mac, see &lt;a href="https://mtu.net/~jpschewe/blog/2022/02/using-password-protected-zip-files-in-mac/" data-type="post" data-id="212"&gt;my post for that platform&lt;/a&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Install 7-Zip&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Do this on both the sending computer and the recipient computer.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Download 7-Zip for your computer from their &lt;a href="https://www.7-zip.org/download.html"&gt;download page&lt;/a&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":202,"sizeSlug":"large"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2020/11/image.png" class="wp-image-202" /&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The first table on the page is the most recent stable version. Pick the 64-bit exe. In this screen shot it is the second row. This should work for most anyone these days. Pay attention to where the file is saved, it is probably in Downloads.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Open File Explorer and navigate to the downloaded file. Double click on the file to start the install. The file will be named 7z1900-64.exe, where the 1900 may be different. There will be a black and white icon next to it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":203,"sizeSlug":"large"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-18-52-35.png" class="wp-image-203" /&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;During the install, the defaults are all fine. You may need to enter an administrator password for the install to finish.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Creating a password protected file&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Start by putting the files that you want to send in a folder by themselves, even if it's only a single file. This makes it easy to keep track of what is being sent. It also helps the recipient as they will get the same folder name when they uncompress the file.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Open Windows Explorer and navigate to the folder that you want to send. Now right click on the folder that you put all of your files in. Then click on 7-Zip and then Add to archive... If the 7-Zip option isn't in the right-click menu, it is likely the case that you installed the 32-bit version rather than the 64-bit version. Uninstall 7-Zip and then go back to the download page and make sure you get the 64-bit version.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":197,"sizeSlug":"large"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2020/11/create-archive-1.png" class="wp-image-197" /&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;In the archive window there is a section in the lower right to enter a password. You need to enter it twice to be sure it was typed correctly. Leave everything else at the defaults. This will use AES-256 encryption, lower right corner, to encrypt the file. The format will be 7-Zip, so the recipient needs 7-Zip to open it. Then click OK. This will create a file with the name that you specified with a 7z extension next to the folder. If you have extensions turned off you may just see the name of the file. In the image below the file to send is the one with the paper icon named "stuff to send.7z". This was created from the yellow folder "stuff to send".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":204,"sizeSlug":"large"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-18-54-19.png" class="wp-image-204" /&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Attach this file to an email and send it with a simple message. DO NOT PUT THE PASSWORD IN THE EMAIL. Contact the recipient through another means, phone, text, encrypted chat (WhatsApp) to send the password.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Opening a password protected file&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The recipient saves the file to their computer. You will need to pay attention to where the file is saved. It might be in Documents, it might be in Downloads or some other location depending on your email client.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Open File Explorer and navigate to the downloaded file. Then right click on the file and select 7-Zip, then Extract Here... You will then be prompted for the password. When it finishes you will have a folder with the files that were sent.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":198,"sizeSlug":"large"} --&gt;

&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://mtu.net/~jpschewe/blog/wp-content/uploads/2020/11/extract.png" class="wp-image-198" /&gt;
&lt;/figure&gt;

&lt;!-- /wp:image --&gt;</content><category term="Blog"/><category term="password zip file"/><category term="windows"/></entry><entry><title>Starting a new duplicati backup</title><link href="https://mtu.net/~jpschewe/blog/2020/08/starting-a-new-duplicati-backup/" rel="alternate"/><published>2020-08-02T17:55:00-05:00</published><updated>2020-08-02T17:55:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2020-08-02:/~jpschewe/blog/2020/08/starting-a-new-duplicati-backup/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The &lt;a href="https://www.duplicati.com/"&gt;Duplicati&lt;/a&gt; backup software is a nice cross platform backup solution. There are times when one wants to start a new backup with the same settings as another backup. Duplicati doesn't support 2 backups going to the same directory, so one needs to make sure to specify a new destination …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The &lt;a href="https://www.duplicati.com/"&gt;Duplicati&lt;/a&gt; backup software is a nice cross platform backup solution. There are times when one wants to start a new backup with the same settings as another backup. Duplicati doesn't support 2 backups going to the same directory, so one needs to make sure to specify a new destination for the new backup.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;

&lt;ol&gt;
&lt;li&gt;Export the backup&lt;ol&gt;
&lt;li&gt;Click on the backup&lt;/li&gt;
&lt;li&gt;Click Export&lt;/li&gt;
&lt;li&gt;Click Export button (accept message about passwords)&lt;/li&gt;
&lt;li&gt;Save file to somewhere on your computer&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Disable scheduled backups of this job for now&lt;ol&gt;
&lt;li&gt;Click on the backup&lt;/li&gt;
&lt;li&gt;Click Edit&lt;/li&gt;
&lt;li&gt;Click Schedule&lt;/li&gt;
&lt;li&gt;Uncheck Automatically run backups&lt;/li&gt;
&lt;li&gt;Click Options&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a new backup from the old configuration&lt;ol&gt;
&lt;li&gt;Click on Add backup&lt;/li&gt;
&lt;li&gt;Import from file&lt;/li&gt;
&lt;li&gt;Select the file on your computer&lt;/li&gt;
&lt;li&gt;Import file&lt;/li&gt;
&lt;li&gt;Change the name from "backup name" to "{backup name} {today's date}"&lt;/li&gt;
&lt;li&gt;Click on Destination&lt;/li&gt;
&lt;li&gt;Change the end of the Path on server to be the current date (this makes sure that we start in a new directory)&lt;/li&gt;
&lt;li&gt;Test connection&lt;/li&gt;
&lt;li&gt;OK to create&lt;/li&gt;
&lt;li&gt;Schedule&lt;/li&gt;
&lt;li&gt;Make sure there is a schedule set&lt;/li&gt;
&lt;li&gt;Options&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Delete the exported backup file from your computer so that the password isn't left around for someone to find&lt;/li&gt;
&lt;li&gt;Start the backup&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Cleanup of old backups&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Once you are certain that the backup is working you should clean up the old backup from the destination to save space. Here are instructions for doing this when the backup destination is &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Delete the backup from the server&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;

&lt;ol&gt;
&lt;li&gt;Click on the backup you want to delete&lt;/li&gt;
&lt;li&gt;Click Edit&lt;/li&gt;
&lt;li&gt;Click on 2 Destination&lt;/li&gt;
&lt;li&gt;The Storage type will be WebDAV - if not, this won't work&lt;/li&gt;
&lt;li&gt;Pay attention to the Server and port and the SSL checkbox.&lt;/li&gt;
&lt;li&gt;In "Path on server" everything before "/remote.php" is the path&lt;/li&gt;
&lt;li&gt;Put the following in the address bar of your web browser https://{host}:{port}/{path}.&lt;ul&gt;
&lt;li&gt;Use "http" instead of "https" if "SSL" is not checked.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Login with the username and password that is configured in the backup.&lt;/li&gt;
&lt;li&gt;Check the box next to the directory from the OLD backup.&lt;/li&gt;
&lt;li&gt;Click the 3 dots next to Actions&lt;/li&gt;
&lt;li&gt;Click delete&lt;/li&gt;
&lt;li&gt;Wait for it to finish&lt;/li&gt;
&lt;li&gt;Use the gear in the top right to log out&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Alternatively I have also found that one can click the checkbox in Duplicati to delete the files from the server when deleting the configuration (see below) and that will remove the files from the server in most cases.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Delete the backup configuration&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;

&lt;ol&gt;
&lt;li&gt;Click on the backup you want to delete&lt;/li&gt;
&lt;li&gt;Click Delete&lt;/li&gt;
&lt;li&gt;Click Delete backup (leave delete remote files unchecked, this was done above)&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="Blog"/></entry><entry><title>Fixing duplicati unexpected difference in fileset</title><link href="https://mtu.net/~jpschewe/blog/2020/08/fixing-duplicati-unexpected-difference-in-fileset/" rel="alternate"/><published>2020-08-02T17:48:00-05:00</published><updated>2020-08-02T17:48:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2020-08-02:/~jpschewe/blog/2020/08/fixing-duplicati-unexpected-difference-in-fileset/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;&lt;a href="https://www.duplicati.com/"&gt;Duplicati&lt;/a&gt; is a nice backup tool that is cross platform. However sometimes it has issues. This post gives one solution for dealing with the error "Unexpected difference in fileset version".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;

&lt;ol&gt;
&lt;li&gt;Open the duplicati web page&lt;/li&gt;
&lt;li&gt;Pay attention to the fileset version number in the error message.&lt;/li&gt;
&lt;li&gt;Dismiss the error&lt;/li&gt;
&lt;li&gt;Click …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;&lt;a href="https://www.duplicati.com/"&gt;Duplicati&lt;/a&gt; is a nice backup tool that is cross platform. However sometimes it has issues. This post gives one solution for dealing with the error "Unexpected difference in fileset version".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;

&lt;ol&gt;
&lt;li&gt;Open the duplicati web page&lt;/li&gt;
&lt;li&gt;Pay attention to the fileset version number in the error message.&lt;/li&gt;
&lt;li&gt;Dismiss the error&lt;/li&gt;
&lt;li&gt;Click on the troubled backup&lt;/li&gt;
&lt;li&gt;Click on commandline&lt;/li&gt;
&lt;li&gt;Change the command at the top to delete&lt;/li&gt;
&lt;li&gt;Clear out the commandline arguments field&lt;/li&gt;
&lt;li&gt;Put "--version=XX" in the commandline arguments field (change XX to version specified in the error message)&lt;/li&gt;
&lt;li&gt;Click Run "delete" command now at the bottom right&lt;/li&gt;
&lt;li&gt;Wait&lt;/li&gt;
&lt;li&gt;Execute a new backup and see if there are errors&lt;/li&gt;
&lt;li&gt;Repeat if necessary&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- /wp:list --&gt;</content><category term="Blog"/><category term="duplicati"/></entry><entry><title>Tracking packages installed</title><link href="https://mtu.net/~jpschewe/blog/2020/07/tracking-packages-installed/" rel="alternate"/><published>2020-07-19T11:35:00-05:00</published><updated>2020-07-19T11:35:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2020-07-19:/~jpschewe/blog/2020/07/tracking-packages-installed/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;To help with restores or migration to another piece of hardware I find it useful to keep track of which packages are installed on my Linux systems. This isn't very difficult, but it has taken a bit of experimenting to come up with with something that works fairly well and …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;To help with restores or migration to another piece of hardware I find it useful to keep track of which packages are installed on my Linux systems. This isn't very difficult, but it has taken a bit of experimenting to come up with with something that works fairly well and is automated.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Create in /etc/systemd/system/status-email-root@.service. This is a helper service for sending emails on service failures.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;status email for %i to Jon&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/sbin/systemd-email.sh root %i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;/usr/local/sbin/systemd-email.sh looks like this&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

debug&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_debug&lt;/span&gt;&lt;span class="p"&gt;-false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEBUG: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
log&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
warn&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;WARNING: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
error&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ERROR: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
fatal&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
try&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; failed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unable to determine script directory&amp;quot;&lt;/span&gt;


/usr/sbin/sendmail&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;ERRMAIL&lt;/span&gt;
&lt;span class="s"&gt;To: $1&lt;/span&gt;
&lt;span class="s"&gt;From: systemd &amp;lt;root@$HOSTNAME&amp;gt;&lt;/span&gt;
&lt;span class="s"&gt;Subject: $2&lt;/span&gt;
&lt;span class="s"&gt;Content-Transfer-Encoding: 8bit&lt;/span&gt;
&lt;span class="s"&gt;Content-Type: text/plain; charset=UTF-8&lt;/span&gt;

&lt;span class="s"&gt;$(systemctl status --full &amp;quot;$2&amp;quot;)&lt;/span&gt;
&lt;span class="s"&gt;ERRMAIL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Create in /etc/systemd/system/track-installed-packages.service with the content. Note the "showmanual" argument to "apt-mark". This makes sure to only output the packages that were manually installed and not include those that were installed as dependencies. This keeps the list short and if dependencies change later keeps from installed unneeded packages later.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;track installed packages&lt;/span&gt;
&lt;span class="na"&gt;OnFailure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;status-email-root@%n.service&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/apt-mark showmanual&lt;/span&gt;
&lt;span class="na"&gt;StandardOutput&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;file:/home/installed-packages.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Now create /etc/systemd/system/track-installed-packages.timer&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;track installed packages daily&lt;/span&gt;

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="na"&gt;OnCalendar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;
&lt;span class="na"&gt;Persistent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Now enable the timer with&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;track&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;installed&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;
&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;track&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;installed&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Now if you backup /home, you'll always have the most recent list of installed packages.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I have a similar pair of systemd files for snaps that calls "snap list" and outputs to "/home/snap-packages.txt". Snap doesn't appear to have an option to specify only manually installed snaps. This may also error out if there are no snaps installed.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</content><category term="Blog"/><category term="Tech Tips"/></entry><entry><title>Configure Linux Jenkins node</title><link href="https://mtu.net/~jpschewe/blog/2020/07/configure-linux-jenkins-node/" rel="alternate"/><published>2020-07-11T18:28:00-05:00</published><updated>2020-07-11T18:28:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2020-07-11:/~jpschewe/blog/2020/07/configure-linux-jenkins-node/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I have been setting up a few Jenkins nodes lately and decided that I should write up the configuration that I'm using to share with others.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Create the node in Jenkins&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The first thing to do is to create the node in Jenkins. Start by logging into your Jenkins host …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;I have been setting up a few Jenkins nodes lately and decided that I should write up the configuration that I'm using to share with others.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Create the node in Jenkins&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;The first thing to do is to create the node in Jenkins. Start by logging into your Jenkins host, then visit the "Manage Jenkins" link. Once there, visit "Manage Nodes" and then click "New Node" on the left.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Give your node a name. It's a good idea to avoid spaces and special characters. I use letters, numbers, underscores and hyphens. Select "Permanent Agent" and then "OK".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Here you need to specify the working directory, labels and the usage. I usually set the usage to only build jobs with a matching label expression. This is useful when setting up nodes per job to make sure that the node doesn't get used for other random jobs. You may also want to specify an email address to notify when the node goes online and/or offline.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Once you have saved the configuration you will see a page specifying that the agent is offline and how to launch it. The important piece of information here is the secret. This will be a very long string of letters and numbers.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;

&lt;h2&gt;Linux Setup&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;First create a user in Linux that the node will run as. This user should not have any special privileges.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo adduser JENKINS_BUILD_USER
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Replace "JENKINS_BUILD_USER" with the username that you are using. By default this user has a locked password so no one can login as this user.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;In "/home/JENKINS_BUILD_USER" create the file "start-jenkins-node.sh" to start the node&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

debug&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_debug&lt;/span&gt;&lt;span class="p"&gt;-false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEBUG: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
log&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
warn&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;WARNING: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
error&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ERROR: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
fatal&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
try&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; failed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unable to determine script directory&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;jenkins_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;JENKINS_HOST
&lt;span class="nv"&gt;jenkins_node_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NODE_NAME
&lt;span class="nv"&gt;jenkins_node_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SECRET

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# --no-check-certificate is needed if the certificate store does not recognize the jenkins host certificate&lt;/span&gt;
try&lt;span class="w"&gt; &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;jenkins_host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/jnlpJars/agent.jar&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;agent.jar

&lt;span class="c1"&gt;# -noCertificateCheck is needed if the certificate isn&amp;#39;t recognized&lt;/span&gt;
nohup&lt;span class="w"&gt; &lt;/span&gt;java&lt;span class="w"&gt; &lt;/span&gt;-jar&lt;span class="w"&gt; &lt;/span&gt;agent.jar&lt;span class="w"&gt; &lt;/span&gt;-jnlpUrl&lt;span class="w"&gt; &lt;/span&gt;https://&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;jenkins_host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/computer/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;jenkins_node_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/slave-agent.jnlp&lt;span class="w"&gt; &lt;/span&gt;-secret&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;jenkins_node_secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-workDir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;/jenkins-node.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Replace JENKINS_HOST with the hostname that Jenkins is running on. This script assumes that Jenkins is running at hte root of your server. If that's not the case you'll want to append the base path to the end of JENKINS_HOST. Replace NODE_NAME with the name of the node and SECRET with the secret from the node configuration on the Jenkins host.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Mark the file executable.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;chmod +x /home/JENKINS_BUILD_USER/start-jenkins-node.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Create "/etc/systemd/system/jenkins_node.service"&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/JENKINS_BUILD_USER/start-jenkins-node.sh&lt;/span&gt;
&lt;span class="na"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/JENKINS_BUILD_USER&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="na"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;JENKINS_BUILD_USER&lt;/span&gt;

&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;span class="na"&gt;Wants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;Replace JENKINS_BUILD_USER with the user that you created. Then you can enable and start the service with&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:code --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jenkins_node&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jenkins_node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- /wp:code --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;At this point you should see your node online in Jenkins and you are ready to use it for jobs.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</content><category term="Blog"/><category term="Jenkins"/></entry><entry><title>My initial experience with Google Inbox</title><link href="https://mtu.net/~jpschewe/blog/2015/10/my-initial-experience-with-google-inbox/" rel="alternate"/><published>2015-10-24T21:33:00-05:00</published><updated>2015-10-24T21:33:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2015-10-24:/~jpschewe/blog/2015/10/my-initial-experience-with-google-inbox/</id><summary type="html">&lt;p&gt;This past week I finally decided to try out Google Inbox. The feature that really drew me to it was the ability to snooze emails. This feature allows you to make an email leave your inbox and come back at some later date and time. This is a really cool …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This past week I finally decided to try out Google Inbox. The feature that really drew me to it was the ability to snooze emails. This feature allows you to make an email leave your inbox and come back at some later date and time. This is a really cool feature and a nice way to delay dealing with an email until you need to. In addition to this it is really easy to create filters that add emails to bundles (labels). These bundles can be set to appear in the inbox or not and you have some control over when the bundles appear in the inbox. When a bundle appears in the inbox it shows up as a wide message, once opened you see all of the messages in the bundle. This is a nice way to be able to group messages; you can see your labels in the inbox in a compact fashion. You can also decide which bundles will trigger notifications in the android app.&lt;/p&gt;
&lt;p&gt;After using Inbox for about a week, I've decided to go back to using GMail. Here are my reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The keyboard shortcuts in the web interface are lacking.&lt;ul&gt;
&lt;li&gt;No keyboard shortcut to goto a label/bundle&lt;/li&gt;
&lt;li&gt;No keyboard shortcut to type in the name of a bundle to move to. There is a shortcut '.' to open the move to menu though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The bar on the left side showing the bundles don't show how many unread messages are in the bundle&lt;/li&gt;
&lt;li&gt;When you choose to have bundles show up in the inbox you can select as the messages arrive, once a day (7:00) and once a week (Monday 7:00). I would really like to be able to at least pick the time for once a day and once a week. It would be nice to be able to pick the day on the once a week.&lt;/li&gt;
&lt;li&gt;I like to make sure all messages that I keep are assigned at least one label. The Inbox interface doesn't allow me to see what labels have been applied to a message. This makes me very concerned that I will loose messages by them being archived and not assigned any labels. GMail's search interface is great, but I really like to be able to find my messages by label.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If Google fixes these features I will give Inbox a try again, until then I'm sticking with GMail.&lt;/p&gt;</content><category term="Blog"/></entry><entry><title>IPv6 on Comcast Residential</title><link href="https://mtu.net/~jpschewe/blog/2014/07/ipv6-on-comcast-residential/" rel="alternate"/><published>2014-07-04T13:32:00-05:00</published><updated>2014-07-04T13:32:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2014-07-04:/~jpschewe/blog/2014/07/ipv6-on-comcast-residential/</id><summary type="html">&lt;p&gt;Comcast has now opened up their IPv6 service to residential customers. If you have a &lt;a href="http://mydeviceinfo.comcast.net/"&gt;supported modem&lt;/a&gt; from Comcast and a device connected to it that understands IPv6 you can connect. You might ask why would I want to setup IPv6? And that is a good question. One reason is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Comcast has now opened up their IPv6 service to residential customers. If you have a &lt;a href="http://mydeviceinfo.comcast.net/"&gt;supported modem&lt;/a&gt; from Comcast and a device connected to it that understands IPv6 you can connect. You might ask why would I want to setup IPv6? And that is a good question. One reason is to stay up to date with current networking technology. Another reason is that we're running out of IPv4 addresses and we will eventually need to switch to IPv6. Currently many sites on the Internet are supporting IPv4 and IPv6 to help with the adoption of IPv6. Another reason for IPv6 support is that this setup can give you a subnet of public IPv6 addresses to use in your house. Meaning that you can allow computers on your internal network to be accessible from the outside world. Of course this also means that you could potentially open up your computers to the outside world, so you need to be careful and setup your firewall to keep your internal computers secure unless you want them accessible. This also removes any issues with NAT as IPv6 doesn't have any NAT support.&lt;/p&gt;
&lt;p&gt;For my setup I have a compatible modem from Comcast and a Linux computer as my router. My Linux computer is running Ubuntu. These instructions are specific to my setup, but should be able to be used by others running most any Linux distribution.&lt;/p&gt;
&lt;p&gt;The first thing you should do is secure your network from IPv6 so that something doesn't get in while you're setting things up. Here is my IPv6 firewall setup, it's very similar to my IPv4 setup, except the port numbers for DHCP are different. Outbound traffic is allowed and inbound traffic is denied. I've also disabled forwarding of traffic, this prevents inbound traffic directly to the internet work. This script needs to be located at "/usr/local/sbin/firewall-ipv6-start" for the radvd script at the end of this post to work properly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/sbin/ip6tables
&lt;span class="nv"&gt;INET_IFACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eth0&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;LAN_IFACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eth1&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;LO_IFACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lo&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;$IPTABLES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-F
&lt;span class="nv"&gt;$IPTABLES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-X

&lt;span class="c1"&gt;# accept everything by default&lt;/span&gt;
&lt;span class="nv"&gt;$IPTABLES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt; &lt;/span&gt;DROP
&lt;span class="nv"&gt;$IPTABLES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;OUTPUT&lt;span class="w"&gt; &lt;/span&gt;ACCEPT
&lt;span class="nv"&gt;$IPTABLES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;FORWARD&lt;span class="w"&gt; &lt;/span&gt;DROP

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;FORWARD&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;--state&lt;span class="w"&gt; &lt;/span&gt;RELATED,ESTABLISHED&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allow inbound traffic for established and related connections&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT
&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;FORWARD&lt;span class="w"&gt;   &lt;/span&gt;
-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LAN_IFACE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INET_IFACE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allow all Internet bound traffic from the internal network&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT
&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;FORWARD&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;ipv6-icmp&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forward any ICMP traffic&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;--state&lt;span class="w"&gt; &lt;/span&gt;RELATED,ESTABLISHED&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allow inbound traffic for established and related connections&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt;   &lt;/span&gt;
-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LO_IFACE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allow any local-only traffic&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt;   &lt;/span&gt;
-p&lt;span class="w"&gt; &lt;/span&gt;ipv6-icmp&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allow ICMP traffic from anywhere&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INET_IFACE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-p&lt;span class="w"&gt; &lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;--dport&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;546&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Accept DHCP traffic&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT

&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPTABLES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INET_IFACE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-p&lt;span class="w"&gt; &lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;--dport&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;547&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-m&lt;span class="w"&gt; &lt;/span&gt;comment&lt;span class="w"&gt; &lt;/span&gt;--comment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Accept DHCP traffic&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The remainder of this post is based upon &lt;a href="http://www.ipcalypse.ca/?p=204"&gt;this post on using DHCPv6 with prefix delegation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next thing we need to do is get an address from Comcast along with a prefix (subnet) to hand out to the computers on the internal network. Comcast doesn't appear to be using router advertisements for IPv6, so we'll need to use DHCP over IPv6. For this I could use the ISC DHCP server that I'm using for IPv4, but it doesn't support prefix delegation which I need to give the other computers in my house IPv6 addresses. For this I installed wide dhcp client. Ubuntu includes this in the package wide-dhcpv6-client. A side advantage to using a different DHCP client for IPv6 is that you can turn it off to disable IPv6 support without messing with your IPv4 network. Once you install the client edit /etc/wide-dhcpv6/dhcp6c.conf to look like this. You will need to modify the interface used and possibly the sla-len. I found the sla-len by trial and error. You won't get a prefix if the value is incorrect.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;eth0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;external&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;facing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;WAN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ia&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;na&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ia&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;pd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/etc/wide-dhcpv6/dhcp6c-script&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;assoc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;eth1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;internal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;facing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LAN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sla&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Combined&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ia&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;pd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ifid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;postfix&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EUI&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Combined&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SLA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;full&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sla&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bits&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;assigned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Take&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;you&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;re&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;assigned&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subtract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;In&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;assigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;thus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;assoc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;na&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;assoc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;external&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When you start the wide DHCP client and all is happy you will find that your external interface has an address. In my case it starts with 2001:558:6014. See the output of "ip addr show dev eth0" changing the interface as appropriate. Below is the output for my system with the IP addresses masked out.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BROADCAST&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;MULTICAST&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;UP&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LOWER_UP&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qdisc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pfifo_fast&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qlen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ether&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;brd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XXX&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XXX&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XXX&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XXX&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;brd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;255.255&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;255.255&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inet6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;558&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6014&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inet6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fe80&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once this is setup you can ping IPv6 addresses from your router. You can test this with "ping6 google.com".&lt;/p&gt;
&lt;p&gt;Now to allow your local network talk to the Internet via IPv6 you'll need to allow forwarding and then assign them IPv6 addresses.&lt;/p&gt;
&lt;p&gt;First we'll tell the kernel to allow forwarding by modifying adding the file 70-ipv6-routing.conf to /etc/sysctl.d. Note that net.ipv6.conf.all.accept_ra is set to 2. Any other value will not work due to how the router advertisements are handled.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; only set this on the external interface, otherwise we don&amp;#39;t get a
&lt;span class="gh"&gt;#&lt;/span&gt; default route for IPv6
net.ipv6.conf.EXT_IFACE.accept_ra=2
net.ipv6.conf.EXT_IFACE.forwarding=0

net.ipv6.conf.INT_IFACE.accept_ra=1
net.ipv6.conf.INT_IFACE.forwarding=1

net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.autoconf=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once you change these values you will need to reboot or use the sysctl utility to set them immediately.&lt;/p&gt;
&lt;p&gt;Now to hand out IPv6 addresses to the rest of the network. This will be done by setting up radvd. The package 'radvd' on Unbuntu contains this daemon. Once installed you can setup /etc/radvd.conf for the prefix that Comcast gave you. However when your IP address changes you'll need to update the file. So instead I have created a script that can be run from wide dhcp client. Put the following in "/usr/local/sbin/update-ipv6-setup.sh" and add a call to this script from the end of /etc/wide-dhcpv6/dhcp6c-script. You'll need to change the interface in this script to be your internal interface.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

debug&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_debug&lt;/span&gt;&lt;span class="p"&gt;-false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEBUG: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
log&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
warn&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;WARNING: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
error&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ERROR: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
fatal&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
try&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; failed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unable to determine script dir&lt;/span&gt;
&lt;span class="s2"&gt;ectory&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;-6&lt;span class="w"&gt; &lt;/span&gt;addr&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;eth1&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt;   &lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;inet6&lt;span class="w"&gt;   &lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unable to get prefix&amp;quot;&lt;/span&gt;

cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/radvd.conf.new&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;

&lt;span class="s"&gt;interface eth1&lt;/span&gt;
&lt;span class="s"&gt;{&lt;/span&gt;
&lt;span class="s"&gt; AdvSendAdvert on;&lt;/span&gt;
&lt;span class="s"&gt; AdvIntervalOpt on;&lt;/span&gt;
&lt;span class="s"&gt; MinRtrAdvInterval 60;&lt;/span&gt;
&lt;span class="s"&gt; MaxRtrAdvInterval 300;&lt;/span&gt;
&lt;span class="s"&gt; AdvLinkMTU 1280;&lt;/span&gt;
&lt;span class="s"&gt; AdvOtherConfigFlag on;&lt;/span&gt;
&lt;span class="s"&gt; AdvHomeAgentFlag off;&lt;/span&gt;

&lt;span class="s"&gt; prefix ${prefix}&lt;/span&gt;
&lt;span class="s"&gt; {&lt;/span&gt;
&lt;span class="s"&gt; AdvOnLink on;&lt;/span&gt;
&lt;span class="s"&gt; AdvAutonomous on;&lt;/span&gt;
&lt;span class="s"&gt; AdvRouterAddr on;&lt;/span&gt;
&lt;span class="s"&gt; };&lt;/span&gt;
&lt;span class="s"&gt;};&lt;/span&gt;

&lt;span class="s"&gt;EOF&lt;/span&gt;

diff&lt;span class="w"&gt; &lt;/span&gt;/etc/radvd.conf.new&lt;span class="w"&gt; &lt;/span&gt;/etc/radvd.conf&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ne&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# only move if there are differences&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;try&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/radvd.conf.new&lt;span class="w"&gt; &lt;/span&gt;/etc/radvd.conf
&lt;span class="w"&gt;  &lt;/span&gt;try&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt; &lt;/span&gt;radvd&lt;span class="w"&gt; &lt;/span&gt;restart
&lt;span class="k"&gt;fi&lt;/span&gt;
try&lt;span class="w"&gt; &lt;/span&gt;/usr/local/sbin/firewall-ipv6-start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now you have IPv6 setup on your router and your home network. I found that Linux, Windows and Mac automatically recognize the IPv6 router advertisements and grab addresses and setup routes appropriately.&lt;/p&gt;
&lt;p&gt;Resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.comcast6.net/"&gt;Comcast IPv6 information blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://test-ipv6.com/"&gt;Test IPv6 setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ipcalypse.ca/?p=204"&gt;Basis for this post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tcpipguide.com/free/t_IPv6InterfaceIdentifiersandPhysicalAddressMapping-2.htm"&gt;IPv6 and physical address mapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://speedtest.comcast.net/"&gt;IPv6 speed test from Comcast&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Blog"/><category term="Tech Tips"/></entry><entry><title>Skitch for easy sharing of drawings</title><link href="https://mtu.net/~jpschewe/blog/2012/02/skitch-for-easy-sharing-of-drawings/" rel="alternate"/><published>2012-02-20T11:14:00-06:00</published><updated>2012-02-20T11:14:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2012-02-20:/~jpschewe/blog/2012/02/skitch-for-easy-sharing-of-drawings/</id><summary type="html">&lt;p&gt;I use a Mac at work and was recently introduced to &lt;a href="http://skitch.com/"&gt;Skitch&lt;/a&gt; in a training class. This application is really handy if you need to share images or screen shots with others. Skitch allows you to easily take a screen shot of what you're doing and then annotate it to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I use a Mac at work and was recently introduced to &lt;a href="http://skitch.com/"&gt;Skitch&lt;/a&gt; in a training class. This application is really handy if you need to share images or screen shots with others. Skitch allows you to easily take a screen shot of what you're doing and then annotate it to state what is important in the image. You can also easily do simple drawings and then share them. Once you have an image that you like you can just drag it to your email program, or if you sign up for an account with Skitch you can have the image uploaded there and accessible from their website.&lt;/p&gt;</content><category term="Blog"/><category term="Mac"/><category term="Tech Tips"/></entry><entry><title>Finally able to use my iPod Touch without Windows or Mac</title><link href="https://mtu.net/~jpschewe/blog/2012/02/finally-able-to-use-my-ipod-touch-without-windows-or-mac/" rel="alternate"/><published>2012-02-20T11:10:00-06:00</published><updated>2012-02-20T11:10:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2012-02-20:/~jpschewe/blog/2012/02/finally-able-to-use-my-ipod-touch-without-windows-or-mac/</id><summary type="html">&lt;p&gt;I've finally made it. I can now use my iPod Touch just with Linux. Apple adding over the air updates really helped, but I still couldn't sync my music. I also found that pulling large videos off via Dropbox didn't work as the app would time out. I had been …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've finally made it. I can now use my iPod Touch just with Linux. Apple adding over the air updates really helped, but I still couldn't sync my music. I also found that pulling large videos off via Dropbox didn't work as the app would time out. I had been trying to get gtkpod to work, but kept running into a problem with the database checksum on the music database. Recently I found &lt;a href="http://itunes.apple.com/us/app/phone-drive-file-sharing-wifi/id431033044?mt=8"&gt;Phone Drive&lt;/a&gt; and this has solved my problem. This app lets me copy images and videos out of my camera roll into the app and then the app will bring up a web server and an ftp server on the device. I can then browse the files from my web browser and download the files to my desktop. I can also put files up this way. Phone Drive also has a built in music player that will play any directory as a playlist and supports users adding their own playlists. So I wrote a little script (below) that will generate a playlist for all music and one for each artist on my computer and then I can upload those and all of my music via ftp. I did have a little trouble with some ftp programs that want to open multiple connections. In the end I used ncftp as it doesn't try to open multiple connections and it has the ability to upload directories recursively. I did find one oddity that I needed to turn off the auto conversion of ascii files otherwise playlist files got their line endings changed and Phone Drive wouldn't recognize them.&lt;/p&gt;
&lt;p&gt;So my current list of apps that I regularly use is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calendar syncing with Google, either via Active Sync or via caldav (this allows the colors to sync)&lt;/li&gt;
&lt;li&gt;Contacts syncing with Google as an Exchange account&lt;/li&gt;
&lt;li&gt;GMail app for mail from Google as I prefer the way Google does conversations&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.appigo.com/todo"&gt;Appigo Todo&lt;/a&gt; syncing with &lt;a href="http://www.toodledo.com/"&gt;Toodledo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/app/plaintext-dropbox-text-editing/id391254385?mt=8"&gt;PlainText&lt;/a&gt; for notes&lt;/li&gt;
&lt;li&gt;&lt;a href="dropbox.com"&gt;Dropbox&lt;/a&gt; for keeping family pictures and moving images between my device and my computer&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/app/minikeepass-secure-password/id451661808?mt=8"&gt;MiniKeePass&lt;/a&gt; on my device and &lt;a href="http://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; syncing through Dropbox&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/app/podcaster-4/id377195245?mt=8"&gt;Podcaster&lt;/a&gt; for audio and video podcasts&lt;/li&gt;
&lt;li&gt;&lt;a href="http://readitlaterlist.com/"&gt;ReadItLater&lt;/a&gt; for offline access to web pages&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

debug&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_debug&lt;/span&gt;&lt;span class="p"&gt;-false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEBUG: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
log&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
warn&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;WARNING: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
error&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ERROR: &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
fatal&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fatal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unable to determine script directory&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mp3&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# generate artist playlists&lt;/span&gt;
find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-maxdepth&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;d&lt;span class="w"&gt; &lt;/span&gt;-print0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;$&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dir
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;short_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;#./&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;short_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;playlist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/itouch-playlists/aaa_&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;short_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.m3u&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Processing &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;short_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;playlist&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;short_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*.mp3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-printf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/music/%p\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;playlist&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;playlist&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c1"&gt;# generate all music playlist&lt;/span&gt;
log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Generating all music playlist&amp;quot;&lt;/span&gt;
find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*.mp3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
-fprintf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mydir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mp3/aaa_all_music-new.m3u&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/music/%P\n&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</content><category term="Blog"/><category term="iPod Touch"/></entry><entry><title>Appigo Todo now supports Dropbox</title><link href="https://mtu.net/~jpschewe/blog/2011/09/appigo-todo-now-supports-dropbox/" rel="alternate"/><published>2011-09-04T20:47:00-05:00</published><updated>2011-09-04T20:47:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-09-04:/~jpschewe/blog/2011/09/appigo-todo-now-supports-dropbox/</id><summary type="html">&lt;p&gt;On my iPod Touch I'm using Appigo's Todo application. I had been syncing the data to Toodledo so that I had a backup in case something happened to my itouch. Now Appigo's Todo app supports Dropbox. The advantage here is that the place that I'm syncing to, dropbox, supports all …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On my iPod Touch I'm using Appigo's Todo application. I had been syncing the data to Toodledo so that I had a backup in case something happened to my itouch. Now Appigo's Todo app supports Dropbox. The advantage here is that the place that I'm syncing to, dropbox, supports all of the features of the Todo app. This is important for recovery. Toodledo doesn't support hierarchical todo items. However when syncing with dropbox it's in Appigo's own format so all features are supported. And it turns out the native format is an sqlite database, so I can pull all of the items out of it in case Appigo goes away!&lt;/p&gt;
&lt;p&gt;2/20/2012 update. I've gone back to Toodledo.com for syncing as the Dropbox sync for the todo app was just too slow. The Toodledo sync is faster, but it's not a smart as it keeps trying to sync when I'm offline and then popping up an error dialog. I've contacted Appigo about this, but haven't seen a fix yet.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/></entry><entry><title>Passwords for iTouch and iPhone</title><link href="https://mtu.net/~jpschewe/blog/2011/08/passwords-for-itouch-and-iphone/" rel="alternate"/><published>2011-08-07T18:27:00-05:00</published><updated>2011-08-07T18:27:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-08-07:/~jpschewe/blog/2011/08/passwords-for-itouch-and-iphone/</id><summary type="html">&lt;p&gt;Until recently I've been using &lt;a href="http://mykeepass.blogspot.com/"&gt;MyKeePass&lt;/a&gt; to store passwords on my iTouch. This allows me to use &lt;a href="http://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; on my desktop. What I'd really like though is Dropbox integration. Well recently on &lt;a href="http://www.hak5.org"&gt;Hak5&lt;/a&gt; they said that there was a free app for IOS that understood &lt;a href="http://keepass.info/"&gt;KeePass&lt;/a&gt; password databases and MyKeePass …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Until recently I've been using &lt;a href="http://mykeepass.blogspot.com/"&gt;MyKeePass&lt;/a&gt; to store passwords on my iTouch. This allows me to use &lt;a href="http://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; on my desktop. What I'd really like though is Dropbox integration. Well recently on &lt;a href="http://www.hak5.org"&gt;Hak5&lt;/a&gt; they said that there was a free app for IOS that understood &lt;a href="http://keepass.info/"&gt;KeePass&lt;/a&gt; password databases and MyKeePass isn't free. So I went looking and found &lt;a href="http://minikeepass.github.com/"&gt;MiniKeePass&lt;/a&gt; and discovered that it's open-source and free. On top of that it integrates nicely with Dropbox! You still need to manually sync the database, but it's really easy if you keep it in Dropbox. When you make changes on your desktop, you just open the Dropbox application on your iTouch and open the database and it imports right into MiniKeePass, then delete the old database from MiniKeePass. When you make changes on your iTouch, you can export it to Dropbox and overwrite the one there so that your desktop sees the changes.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/></entry><entry><title>Backing up cloud data</title><link href="https://mtu.net/~jpschewe/blog/2011/06/backing-up-cloud-data/" rel="alternate"/><published>2011-06-05T18:32:00-05:00</published><updated>2011-06-05T18:32:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-06-05:/~jpschewe/blog/2011/06/backing-up-cloud-data/</id><summary type="html">&lt;p&gt;This year I replaced my Palm Treo with an iPod Touch. To make sure that I could access all of my data on my iPod as well as on my Linux desktop (and anywhere else for that matter) I moved all of my data to the cloud. This is great …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This year I replaced my Palm Treo with an iPod Touch. To make sure that I could access all of my data on my iPod as well as on my Linux desktop (and anywhere else for that matter) I moved all of my data to the cloud. This is great for accessibility, however I still want backups in case something happens to the cloud provider. Remember that all data needs to be backed up or you run the risk of losing it.&lt;/p&gt;
&lt;p&gt;The 3 cloud providers that I am currently using and want backups for are Google Contacts, Google Calendar and &lt;a href="http://www.toodledo.com/"&gt;Toodledo&lt;/a&gt;. My backups are done from my Linux desktop, so I'm using unix tools to do the work. I'm sure people can find replacements under Windows as well.&lt;/p&gt;
&lt;p&gt;I wrote a script for each job (based upon various solutions that I found on the net). The data for each cloud service is backed up into a directory named by the date and I choose to keep 30 days worth of backups, so that I can go back and pull information that I may have accidentally changed or deleted.&lt;/p&gt;
&lt;p&gt;First up is Google Calendar.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash -e&lt;/span&gt;
&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/backup/pim/calendar
&lt;span class="nv"&gt;date_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;date_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
find&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-maxdepth&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;d&lt;span class="w"&gt; &lt;/span&gt;-mtime&lt;span class="w"&gt; &lt;/span&gt;+30&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\{\}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;
&lt;span class="nv"&gt;CURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;curl -s -S&amp;quot;&lt;/span&gt;
&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/cal.xml&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PRIVATE_URL_FROM_GOOGLE&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here I setup some variables to determine the name of the directory based upon date. I then delete anything older than 30 days. The real key here is the last line. This tells curl to download the calendar and save it locally as "cal.xml". The PRIVATE_URL_FROM_GOOGLE is found by going to calendar settings for the calendar in Google. At the bottom is the private address with 3 links for XML, ICAL, and HTML. I choose to download the XML version, but you can pick any that you want to work with. Since this script has your private calendar URL, you should protect it from others as they can change your calendar with this URL.&lt;/p&gt;
&lt;p&gt;Backing up Google Contacts is a little harder because you have to login to get the contacts. I found a &lt;a href="http://spiegl.de/blog/nano/archives/2010/05/26/automatic_backup_of_google_contacts/"&gt;script to do this&lt;/a&gt; searching Google. I found &lt;a href="http://www.t3ch.com/2009/03/28/backup_google_contacts/"&gt;a script written in python&lt;/a&gt; that dumps the contacts in Google's XML format. I don't know the best way to load back from this format, but I'm sure I could figure it out if needed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gdata.contacts.service&lt;/span&gt;

&lt;span class="n"&gt;gd_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactsService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;gd_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user@gmail.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactsQuery&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="c1"&gt;# change for max contacts returned&lt;/span&gt;

&lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gd_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetContactsFeed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUri&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then I wrote a wrapper script like the one for Google Calendar that puts the data where I want it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash -e&lt;/span&gt;
&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/backup/pim/contacts
&lt;span class="nv"&gt;date_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;date_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
find&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-maxdepth&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;d&lt;span class="w"&gt; &lt;/span&gt;-mtime&lt;span class="w"&gt; &lt;/span&gt;+30&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\{\}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;base
&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/bin/export-gcontact.py&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/contacts.xml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'm sure I could have done this in python too, but I wanted to keep all of my scripts as much the same as possible.&lt;/p&gt;
&lt;p&gt;The last cloud service I needed a backup of was &lt;a href="http://www.toodledo.com/"&gt;Toodledo&lt;/a&gt;. This one uses curl like the one for Google Calendar. Except that it does the login too. This script has curl post to the login page, save the cookies, then visit the XML export page. Since the cookie is saved, we don't get prompted for a login again. I tried to do this trick on the Google Contacts page as well, but it doesn't work because Google embeds a random hash in the login page as a hidden form field that needs to be passed on for the login to work. Anyway here's my Toodledo backup script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash -e&lt;/span&gt;
&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/backup/pim/tododate_dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;date_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--form&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;email=YOUR_EMAIL&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;--form 'pass=YOUR_PASSWORD' \ 
      --form 'remember=1' \ 
      --cookie-jar ${root}/cookies.txt \ 
      http://www.toodledo.com/signin.php \ 
      --output toodledo.xml \ 
      http://www.toodledo.com/xml.php&lt;/p&gt;
&lt;p&gt;Note that this script has your username and password in it, so you'll want to set the permissions on the script to keep others out.&lt;/p&gt;
&lt;p&gt;To backup my email from gmail, I've found &lt;a href="http://offlineimap.org/"&gt;offlineimap&lt;/a&gt; to be a great application and easy to setup.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="Tech Tips"/></entry><entry><title>Passwords on the iPod Touch</title><link href="https://mtu.net/~jpschewe/blog/2011/03/passwords-on-the-ipod-touch/" rel="alternate"/><published>2011-03-03T20:07:00-06:00</published><updated>2011-03-03T20:07:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-03-03:/~jpschewe/blog/2011/03/passwords-on-the-ipod-touch/</id><summary type="html">&lt;p&gt;On my Palm I used &lt;a href="http://gnukeyring.sourceforge.net/"&gt;Keyring&lt;/a&gt; to keep track of my passwords. This has a nice interface in &lt;a href="http://www.jpilot.org/"&gt;jpilot&lt;/a&gt; to access it on my desktop. When it came to my iPod Touch I needed to find something else to use. I did some searching and found that there was an …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On my Palm I used &lt;a href="http://gnukeyring.sourceforge.net/"&gt;Keyring&lt;/a&gt; to keep track of my passwords. This has a nice interface in &lt;a href="http://www.jpilot.org/"&gt;jpilot&lt;/a&gt; to access it on my desktop. When it came to my iPod Touch I needed to find something else to use. I did some searching and found that there was an open source password program called &lt;a href="http://keepass.info/"&gt;KeePass&lt;/a&gt; that had applications for many platforms (including Windows, Linux, Mac and IOS).  It turns out that there is an old version of the database (1.x) and a new version (2.x). There isn't an application for the new format on Linux yet, so I choose to use the old database format and the desktop application &lt;a href="http://www.keepassx.org/"&gt;KeePassX&lt;/a&gt;. There are two applications for IOS listed on the KeePass website: &lt;a href="http://mykeepass.wikidot.com/start"&gt;MyKeePass&lt;/a&gt; and &lt;a href="http://ikeepass.de/"&gt;iKeepass&lt;/a&gt;. I chose  MyKeePass because it supports both the old and new formats and seems to have been updated more recently.&lt;/p&gt;
&lt;p&gt;MyKeePass can store multiple databases and those databases can be loaded from a public website, or from it's own web server. You can tell the application you want to import a database file and it starts up a mini web server that just has an upload page and tells you the URL to visit. If your computer is on the same network you can visit this URL and then upload the database and it's on your device. This is pretty nice. It would even better if MyKeePass could read the database file from Dropbox, but that functionality doesn't exist yet. You can have MyKeePass reference a public URL and that could be a public file in Dropbox, but that seems a little to open for me. I'd prefer it to be a private folder on Dropbox that I store my database in.&lt;/p&gt;
&lt;p&gt;I found an &lt;a href="https://github.com/philipp/keyring2keepass"&gt;XSLT&lt;/a&gt; to convert the output of the &lt;a href="http://gnukeyring.sourceforge.net/conduits.html"&gt;keyring XML exporter&lt;/a&gt; to the 2.x format of KeePass, but not to the 1.x format. So I hacked on the 2.x XSLT some and created &lt;a href="https://github.com/jpschewe/keyring2keepass"&gt;my version for 1.x&lt;/a&gt;. This is a fork of the original that I hope will get pulled into the main.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="palm"/><category term="Tech Tips"/></entry><entry><title>Offline web pages on iPod Touch</title><link href="https://mtu.net/~jpschewe/blog/2011/02/offline-web-pages-on-ipod-touch/" rel="alternate"/><published>2011-02-27T21:00:00-06:00</published><updated>2011-02-27T21:00:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-02-27:/~jpschewe/blog/2011/02/offline-web-pages-on-ipod-touch/</id><summary type="html">&lt;p&gt;One of the things that I really liked about my Palm was using &lt;a href="http://www.plkr.org/"&gt;Plucker&lt;/a&gt; to view web pages when I'm not connected to the Internet. I've found a few apps for the iPod Touch that do this and here are the ones I've tried and what I think about them …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the things that I really liked about my Palm was using &lt;a href="http://www.plkr.org/"&gt;Plucker&lt;/a&gt; to view web pages when I'm not connected to the Internet. I've found a few apps for the iPod Touch that do this and here are the ones I've tried and what I think about them.&lt;/p&gt;
&lt;p&gt;I read all of my news using &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt; and so I wanted an app that would sync with it and keep the articles offline so that I could read them later. I tried &lt;a href="http://itunes.apple.com/us/app/byline/id284946773?mt=8"&gt;Byline&lt;/a&gt; and &lt;a href="http://itunes.apple.com/eg/app/mobilerss-free-google-reader/id333925239?mt=8"&gt;MobileRSS&lt;/a&gt;. Both are good RSS readers, however I've found that I prefer MobileRSS. The syncing of all messages and ability to scan through all messages easily is great. Also MobileRSS allows one to send web pages to multiple other services, twitter, email, safari, Instapaper, Read It Later, etc. I'm currently using the free version and it works nicely. I'll probably upgrade to the pro version to get rid of the ads eventually.&lt;/p&gt;
&lt;p&gt;For generic web pages I started out using &lt;a href="http://iwebsaver.com/"&gt;iWebSaver favelet&lt;/a&gt;. This favelet takes a given web page and sends it through the iWebSaver favelet site and produces a data page that can be stored on your IOS device. This data page is then opened in Safari when you want to view it. The advantage to this is that you have the whole page as is downloaded onto your device. The problem is that it takes a long time to load and doesn't remember where you are in the page.&lt;/p&gt;
&lt;p&gt;Next I tried &lt;a href="http://www.instapaper.com/u"&gt;Instapaper&lt;/a&gt;. This has worked very well for most pages. I've been very happy with the scaled down version of web pages. However I found that my &lt;a href="http://www.ssnet.org/qrtrly/eng/11a/less10.html"&gt;Bible study&lt;/a&gt; had a problem with rendering. I couldn't see the days. I'm guessing this is some CSS magic that gets stripped out by Instapaper as extra visuals.&lt;/p&gt;
&lt;p&gt;I then gave &lt;a href="http://readitlaterlist.com/"&gt;Read It Later&lt;/a&gt; a try. At first I thought that it wasn't going to help because the stripped down page looked the same as Instapaper and my Bible study still didn't work. However then I noticed a button at the bottom of the page with a 'T' on it. It turns out that this toggles the page from the stripped down text version to the full page. With a little reading through the options I found that if I disable auto picking of the "right" format to download I can have Read It Later always download both the text and full versions of the page. Then when I'm offline I can toggle between the two. This allows me to view most pages in text and then pages like my Bible study as the full page.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="Tech Tips"/></entry><entry><title>Palm Contacts to Google</title><link href="https://mtu.net/~jpschewe/blog/2011/02/palm-contacts-to-google/" rel="alternate"/><published>2011-02-23T20:56:00-06:00</published><updated>2011-02-23T20:56:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-02-23:/~jpschewe/blog/2011/02/palm-contacts-to-google/</id><summary type="html">&lt;p&gt;I have already been using Google to store some of my contacts for syncing using &lt;a href="http://www.zindus.com/"&gt;Zindus&lt;/a&gt;. So it seemed pretty natural to use Google to store all of my contacts.  Using Google means that my information is available on any platform. Google provides a nice &lt;a href="http://www.google.com/mobile/sync/"&gt;sync interface&lt;/a&gt; for the iPod …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have already been using Google to store some of my contacts for syncing using &lt;a href="http://www.zindus.com/"&gt;Zindus&lt;/a&gt;. So it seemed pretty natural to use Google to store all of my contacts.  Using Google means that my information is available on any platform. Google provides a nice &lt;a href="http://www.google.com/mobile/sync/"&gt;sync interface&lt;/a&gt; for the iPod touch that works well in an offline mode, so I was happy with it.&lt;/p&gt;
&lt;p&gt;Originally I started writing an application in python to convert my Palm contacts to Google. As I got close to having this done I discovered that the Birthday and Anniversary fields couldn't get populated via the python API from Google (it may work now, but didn't work then). So I started looking for other options.&lt;/p&gt;
&lt;p&gt;It turns out that Google allows you to export your contacts in a CSV format and can import in that CSV format as well. So I entered a few contacts with all of the fields that I wanted and then did an export to see what I got. The CSV file was pretty standard, but had lots of extra columns. So I tried trimming it down and discovered that I actually need to have most of the columns, even if they're blank, otherwise Google wouldn't recognize some of the other non-blank columns. This seems kind of odd, but my guess is that Google is looking for some set of column names to determine if it's a CSV file from Outlook or one from Google.&lt;/p&gt;
&lt;p&gt;So now I needed to get my contacts into the Google CSV format. I started by exporting from jpilot and then trying to reorganize the data. This got old real fast. So I wrote another application in C++ using the &lt;a href="http://www.pilot-link.org/"&gt;pilot link library&lt;/a&gt; that would output my CSV files. I've put this application up on &lt;a href="https://github.com/jpschewe/palm-conversion-tools/tree/master/contact-export"&gt;github&lt;/a&gt; so that anyone else can use it as well.&lt;/p&gt;
&lt;p&gt;After running this application I had a nice CSV file that I was able to import into Google and all of my contacts were now available to my iTouch. I did end up hacking the IM conversion as I didn't have many contacts with IM information in my Palm. Otherwise the conversion went pretty well.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="palm"/><category term="Tech Tips"/></entry><entry><title>Convert Palm Calendar to Google</title><link href="https://mtu.net/~jpschewe/blog/2011/02/convert-palm-calendar-to-google/" rel="alternate"/><published>2011-02-17T20:34:00-06:00</published><updated>2011-02-17T20:34:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-02-17:/~jpschewe/blog/2011/02/convert-palm-calendar-to-google/</id><summary type="html">&lt;p&gt;I chose to use Google for my calendar. I already use Google for some of my mail and I sync contacts with Thunderbird using &lt;a href="http://www.zindus.com"&gt;Zindus&lt;/a&gt;. Using Google means that my information is available on any platform. Google provides a nice &lt;a href="http://www.google.com/mobile/sync/"&gt;sync interface&lt;/a&gt; for the iPod touch.&lt;/p&gt;
&lt;p&gt;One annoying thing about …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I chose to use Google for my calendar. I already use Google for some of my mail and I sync contacts with Thunderbird using &lt;a href="http://www.zindus.com"&gt;Zindus&lt;/a&gt;. Using Google means that my information is available on any platform. Google provides a nice &lt;a href="http://www.google.com/mobile/sync/"&gt;sync interface&lt;/a&gt; for the iPod touch.&lt;/p&gt;
&lt;p&gt;One annoying thing about the Google calendar integration with the iPod Touch is the lack of the ability to choose the color of the calendar. You need to choose to sync one calendar, then if the calendar color isn't what you want, tell google to not sync the calendar, wait 10 minutes, then tell it to sync again. Repeat until you get the color you want.&lt;/p&gt;
&lt;p&gt;I started writing a python program to do the calendar conversion as &lt;a href="http://jppy.alioth.debian.org/"&gt;jppy&lt;/a&gt; gave me acces to the Palm database and Google has a &lt;a href="http://code.google.com/p/gdata-python-client/"&gt;python version of their API&lt;/a&gt;. However I found the python API to be lagging behind the &lt;a href="http://code.google.com/p/gdata-java-client/"&gt;Java API&lt;/a&gt; in features supported, such as birthday and anniversary information. So I decided to use Java to interact with Google. In initial testing this worked well, however I needed a way to access my Palm database from Java.&lt;/p&gt;
&lt;p&gt;Instead of direct access I choose to write a C++ program that read the Palm database using the &lt;a href="http://www.pilot-link.org/"&gt;pilot link library&lt;/a&gt; and then output using &lt;a href="http://code.google.com/p/protobuf/"&gt;Google protocol buffers&lt;/a&gt;. This kept me from having to rewrite the code to parse the palm database and give me a format that I could read in most any language. The C++ program is available on &lt;a href="https://github.com/jpschewe/palm-conversion-tools/tree/master/palm-export"&gt;github as palm-export&lt;/a&gt;. The Java program for importing into Google calendar is also on &lt;a href="https://github.com/jpschewe/palm-conversion-tools/tree/master/calendar-import"&gt;github as calendar-import&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As of this writing I can import all calendar information except recurrence exceptions. This is when you have a repeating event and have chosen to cancel some of the events in the series. Google supports this concept and I have even gotten it to work for some events. However since I haven't gotten it to work for all and I can't tell when it's not working, I came up with a workaround. Instead of creating the exception I create a new single event for the exception with "EXCEPTION:" prepended to the event name. This way I can recognize when one is canceled and I can just cancel the single event in Google, which works fine.&lt;/p&gt;
&lt;p&gt;After the import I found a few of my appointments off by an hour. I suspect some timezones on recurring events didn't get in correctly, so you'll want to check appointments that are created with timezones in your Palm.&lt;/p&gt;
&lt;p&gt;A couple of things to note. The iTouch doesn't support all repeat types nor all alarm durations that the Palm does, however Google does. What this means is that these will show up as "Custom" in the iTouch and cannot be entered directly. So when you want to use an alarm or repeat type that the iTouch doesn't support you'll need to use the Google web interface to the calendar and then wait for the data to sync, which is pretty fast.&lt;/p&gt;
&lt;p&gt;Recently (2/17/2011) I've noted that Google sometimes has trouble loading all of my calendars so they will disappear from the iTouch and then come back later. I'm hoping this is just a temporary situation and will be corrected in the future.&lt;/p&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="palm"/><category term="Tech Tips"/></entry><entry><title>Replacing my Palm</title><link href="https://mtu.net/~jpschewe/blog/2011/02/replacing-my-palm/" rel="alternate"/><published>2011-02-16T21:21:00-06:00</published><updated>2011-02-16T21:21:00-06:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2011-02-16:/~jpschewe/blog/2011/02/replacing-my-palm/</id><summary type="html">&lt;p&gt;I have been using a Palm as my PDA for a number of years. With the decline of the Palm platform I have been looking for a replacement PDA. The smartphones aren't an answer for me as I really don't want to pay for a data plan. I was looking …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have been using a Palm as my PDA for a number of years. With the decline of the Palm platform I have been looking for a replacement PDA. The smartphones aren't an answer for me as I really don't want to pay for a data plan. I was looking at the Archos 43, however I haven't been able to get my hands on one to see how well it works. In particular if the resistive touchscreen is reasonable. Furthermore Best Buy removed the Archos 43 from their website after listing it for 2 months. So I broke down and bought and iPod Touch.&lt;/p&gt;
&lt;p&gt;I run Linux at home, so a major concern is how to sync data. In this post and following posts I will describe the tools that I've chosen to use and why; as well as how I imported my old data. Hopefully this will help others that are considering making such a change or looking to convert from one PDA to another or just want to know what tools others are using.&lt;/p&gt;
&lt;p&gt;I also wanted to make sure that all of my information is available offline as well like my Palm. So I have mapped each of my Palm apps to the apps on my iTouch and then either web applications or a desktop application to view the data on my Linux computer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Todo: &lt;a href="http://www.appigo.com/todo"&gt;Appigo todo&lt;/a&gt; backed in &lt;a href="http://www.toodledo.com/"&gt;Toodledo&lt;/a&gt; to have an online backup. This is also a handy way to edit a bunch of todo items. Note that the free account doesn't support the hierarchies of the Appigo application, but at least the data is there. To import data here I just manually entered the todo items.&lt;/li&gt;
&lt;li&gt;Memo: &lt;a href="http://www.appigo.com/notebook"&gt;Appigo notebook&lt;/a&gt; backed in &lt;a href="http://www.toodledo.com/"&gt;Toodledo&lt;/a&gt;. I tried &lt;a href="http://evernote.com/"&gt;Evernote&lt;/a&gt;, but it was overkill for my needs and I wasn't able to easily import my information from my Palm. To import data I just copied and pasted from &lt;a href="http://www.jpilot.org/"&gt;jPilot&lt;/a&gt; into Toodledo. 3/20 update: I've switched to &lt;a href="http://www.hogbaysoftware.com/products/plaintext"&gt;PlainText&lt;/a&gt; for my memos app. It's really nice because it stores each memo as a text file in Dropbox and then it can be easily edited on my desktop.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pfuel.sourceforge.net/"&gt;pFuel&lt;/a&gt;: &lt;a href="http://appcubby.com/gas/"&gt;Gas Cubby&lt;/a&gt; is a nice application for keeping track of gas mileage and maintenance reminders. It also integrates very well with Appigo's todo application so that maintenance reminders can be turned into todo items. Importing data here was just a matter of exporting from pFuel through the palm memos application and then massaging the CSV file to match what Gas Cubby wants for their &lt;a href="http://appcubby.com/import/request.php"&gt;input format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.plkr.org/"&gt;plucker&lt;/a&gt; (offline web pages): &lt;a href="http://mtu.net/~jpschewe/blog/2011/02/offline-web-pages-on-ipod-touch/" title="Offline web pages on iPod Touch"&gt;See this post for details&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;MyBible: &lt;a href="http://www.laridian.com/"&gt;Laridian&lt;/a&gt; has made MyBible for the Palm and PocketBible for the iPod Touch (and other IOS devices). I was able to transfer all of my Bibles easily. This worked out very well.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gnukeyring.sourceforge.net/"&gt;Keyring&lt;/a&gt;: &lt;a href="http://mykeepass.wikidot.com/start"&gt;MyKeePass&lt;/a&gt; - &lt;a href="http://mtu.net/~jpschewe/blog/2011/03/passwords-on-the-ipod-touch/" title="Passwords on the iPod Touch"&gt;more information on this in a future post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dr-bernd-esser.de/titrax_main.php"&gt;Titrax&lt;/a&gt;: &lt;a href="http://itunes.apple.com/us/app/hourstracker-time-sheet/id321923934?mt=8"&gt;HoursTracker&lt;/a&gt; is a nice application for keeping track of time on projects.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt;: I didn't have this on my Palm, but it's pretty handy for keeping photos as the photo album application won't let me create albums.&lt;/li&gt;
&lt;li&gt;Podcasts: &lt;a href="http://itunes.apple.com/us/app/podcaster-formerly-rss-player/id377195245?mt=8"&gt;Podcaster&lt;/a&gt;. I tried iTunes, but you can't subscribe to a podcast on the device. Podcaster allows me to do this and has a nice refresh feature to grab all of my latest podcasts.&lt;/li&gt;
&lt;li&gt;Calendar: &lt;a href="http://google.com/calendar"&gt;Google Calendar&lt;/a&gt; - &lt;a href="http://mtu.net/~jpschewe/blog/2011/02/convert-palm-calendar-to-google/"&gt;more details in a later post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contacts: &lt;a href="http://google.com/contacts"&gt;Google Contacts&lt;/a&gt; - &lt;a href="http://mtu.net/~jpschewe/blog/2011/02/palm-contacts-to-google/"&gt;more details in a later post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Blog"/><category term="iPod Touch"/><category term="palm"/><category term="Tech Tips"/></entry><entry><title>Setting up Neatx</title><link href="https://mtu.net/~jpschewe/blog/2010/10/setting-up-neatx/" rel="alternate"/><published>2010-10-17T20:24:00-05:00</published><updated>2010-10-17T20:24:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-10-17:/~jpschewe/blog/2010/10/setting-up-neatx/</id><summary type="html">&lt;p&gt;I've been using the free version of the NX server from &lt;a href="http://nomachine.com" title="nomachine"&gt;nomachine&lt;/a&gt; to access my Linux hosts and it's been working really well. I've set it up at work to allowed shared access to our compute server, however we've run into an issue here. The free version limits how many …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been using the free version of the NX server from &lt;a href="http://nomachine.com" title="nomachine"&gt;nomachine&lt;/a&gt; to access my Linux hosts and it's been working really well. I've set it up at work to allowed shared access to our compute server, however we've run into an issue here. The free version limits how many people can use the server. Now we really don't need the support and this isn't like a big production shop where we need a rock solid version, so I started looking for open source alternatives. I found FreeNX, but development there seems to have paused for now. I then found &lt;a href="http://code.google.com/p/neatx/"&gt;Neatx&lt;/a&gt;. It's hosted on google code and appears to be a little rough around the edges, but people claim it works.&lt;/p&gt;
&lt;p&gt;There isn't an installer, but I'm a developer, so I figured this shouldn't be too bad. Turns out that after about 2 hours this evening I was able to get it going. Here are the steps that I followed. Note that I'm doing this on opensuse 11.3. The instructions should work elsewhere though.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install nxclient, nxnode, and nxserver from nomachine's website. I grabbed the RPMs for opensuse and they installed just fine. I had originally done this because these were the binaries I was using, as it turns out I need some libraries from there for neatx to run properly.&lt;/li&gt;
&lt;li&gt;Copy the libraries off to the side to use later. If someone knows how to get around this step, I'd be very happy.&lt;ul&gt;
&lt;li&gt;sudo cp -r /usr/NX/lib /usr/local/nx-lib&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove nxclient, nxnode, and nxserver. We don't need them now.&lt;/li&gt;
&lt;li&gt;mkdir nx&lt;/li&gt;
&lt;li&gt;cd nx&lt;/li&gt;
&lt;li&gt;Download the following source files from &lt;a href="http://nomachine.com/sources"&gt;nomac﻿hine's opensource site&lt;/a&gt;. My downloads were version 3.4.0, but there may be a newer version out when you read this.&lt;ul&gt;
&lt;li&gt;nxagent-3.4.0-11.tar.gz&lt;/li&gt;
&lt;li&gt;nxauth-3.4.0-3.tar.gz&lt;/li&gt;
&lt;li&gt;nxcomp-3.4.0-7.tar.gz&lt;/li&gt;
&lt;li&gt;nxcompext-3.4.0-1.tar.gz&lt;/li&gt;
&lt;li&gt;nxcompshad-3.4.0-3.tar.gz&lt;/li&gt;
&lt;li&gt;nxproxy-3.4.0-2.tar.gz&lt;/li&gt;
&lt;li&gt;nx-X11-3.4.0-4.tar.gz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Untar the sources: for i in *.tar.gz; do tar -xzf \$i; done&lt;/li&gt;
&lt;li&gt;cd nx-X11&lt;/li&gt;
&lt;li&gt;make World&lt;/li&gt;
&lt;li&gt;sudo cp programs/Xserver/nxagent /usr/local/bin/nxagent.real&lt;/li&gt;
&lt;li&gt;Now here is where we use the libraries. I tried finding all of the libraries in the sources that I built, but they weren't enough, something was still missing. So you need to create /usr/local/bin/nxagent as a script with the following content:&lt;ul&gt;
&lt;li&gt;#!/bin/bash&lt;/li&gt;
&lt;li&gt;export LD_LIBRARY_PATH=/usr/local/nx-lib&lt;/li&gt;
&lt;li&gt;exec /usr/local/bin/nxagent.real "\$@"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Download neatx from svn. Note that there aren't any packages when I did this.&lt;ul&gt;
&lt;li&gt;svn co http://neatx.googlecode.com/svn/trunk/neatx neatx-read-only&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Follow the instructions in neatx-read-only/neatx/INSTALL&lt;/li&gt;
&lt;li&gt;Fix the instructions on nx's home dir&lt;ul&gt;
&lt;li&gt;sudo chown -R nx ~nx&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Edit /usr/local/etc/neatx.conf to match your system. Some paths will likely need to be changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should now have neatx setup. Connect to it from any NX client and give it a try. The default neatx.conf has the loglevel set to debug. Leave this on until you've successfully connected, then change it to info to keep your logs from getting real full. I spent a lot of time looking through the output of the debug logs for errors in my setup. Neatx is written in python, although you don't need to know the language to be able to debug most of the errors.&lt;/p&gt;</content><category term="Blog"/><category term="Tech Tips"/></entry><entry><title>Tips for brother printers</title><link href="https://mtu.net/~jpschewe/blog/2010/10/tips-for-brother-printers/" rel="alternate"/><published>2010-10-02T18:30:00-05:00</published><updated>2010-10-02T18:30:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-10-02:/~jpschewe/blog/2010/10/tips-for-brother-printers/</id><summary type="html">&lt;p&gt;Brother makes great, inexpensive laser printers. However the technology that they use to determine when you need new toner is a little too conservative. I've found that it states that I need more toner when there is still quite a bit of toner left. Unfortunately at this point the printer …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Brother makes great, inexpensive laser printers. However the technology that they use to determine when you need new toner is a little too conservative. I've found that it states that I need more toner when there is still quite a bit of toner left. Unfortunately at this point the printer will refuse to print anymore pages unless you replace the toner, or make it believe there is more toner. Being the frugal person that I am, I like to print all the way to the end of my toner. Here's what I've done to be able to print all of the way to the end of a toner cartridge.&lt;/p&gt;
&lt;p&gt;If you have a black and white laser printer, then you need some black electrical tape. Other tape may work, but this is what I've used. You pull out the toner cartridge and note that on each end of the cartridge you'll see a round, clear plastic window. The printer shoots some light down this and if the light reaches the other end, you're told that you need more toner. If you put a piece of black tape across these windows then the printer believes that the toner cartridge is still full. Granted now the only way to know that you're low on toner or out is that things don't print so well. However you are able to print to the end of the toner cartridge.&lt;/p&gt;
&lt;p&gt;If you have a color printer, the process is a little different. I purchased a HL-4040CDN and found that the black tape trick didn't work. Instead I dug up these instructions at &lt;a href="http://www.fixyourownprinter.com/forums/laser/39806"&gt;fix your own printer&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the front cover of the printer&lt;/li&gt;
&lt;li&gt;Press and hold the cancel button&lt;/li&gt;
&lt;li&gt;Press the reprint button while still holding cancel&lt;/li&gt;
&lt;li&gt;Here is the reset menu&lt;/li&gt;
&lt;li&gt;Go to the appropriate cartridge on the menu and reset it and you're done!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;FYI... Pressing the "Go" button and the up arrow gives you the parts life reset menu (drum, laser, fuser, etc.).&lt;/p&gt;</content><category term="Blog"/><category term="brother printer"/><category term="Tech Tips"/></entry><entry><title>Don't delay upgrades</title><link href="https://mtu.net/~jpschewe/blog/2010/08/dont-delay-upgrades/" rel="alternate"/><published>2010-08-31T20:40:00-05:00</published><updated>2010-08-31T20:40:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-08-31:/~jpschewe/blog/2010/08/dont-delay-upgrades/</id><summary type="html">&lt;p&gt;I usually try and upgrade my computers fairly quickly once a new operating system or a new version of an application comes out, even if there aren't particularly new features that I'm looking for. However sometimes I've been a little slow to upgrade some servers because I'm too busy with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I usually try and upgrade my computers fairly quickly once a new operating system or a new version of an application comes out, even if there aren't particularly new features that I'm looking for. However sometimes I've been a little slow to upgrade some servers because I'm too busy with other stuff or it's too hard to schedule downtime. I was reminded this week why it's a good idea to do upgrades sooner rather than later.&lt;/p&gt;
&lt;p&gt;I had some computers that I had gotten behind on upgrading the operating system by about 1 year. The security patches were applied, but there was a newer version of the OS and I just didn't have the time to take care of it. Well, since then I moved out of that job, but still depended on the server. Since then it's up to someone else to upgrade this system and they're much like me, very busy with other things. So time goes on and now this server is 3 years behind on the OS upgrade and there are some major changes in the OS.&lt;/p&gt;
&lt;p&gt;Now it's time to replace the hardware of the machine. Since it's a Linux machine the standard answer is just move the drives and keep going. I suspected there might be problems, so I left my number with my replacement. He started the replacement and well, it didn't go smoothly. As it turns out the new hardware wasn't quite supported by the older OS, such that the system would partially boot, but not completely. So we ended up doing a full upgrade across 3 minor and 1 major versions of the OS and then fixing up all of the little things that broke along the way.&lt;/p&gt;
&lt;p&gt;In the end this probably took longer than it would have to do along the way because the system configuration would have been fresher in our minds. Plus the changes wouldn't have been so drastic and things would likely have migrated much easier.&lt;/p&gt;
&lt;p&gt;So remember to make time to upgrade your systems right away.&lt;/p&gt;</content><category term="Blog"/></entry><entry><title>Migrating bacula from MySQL to PostgreSQL</title><link href="https://mtu.net/~jpschewe/blog/2010/06/migrating-bacula-from-mysql-to-postgresql/" rel="alternate"/><published>2010-06-25T19:59:00-05:00</published><updated>2010-06-25T19:59:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-06-25:/~jpschewe/blog/2010/06/migrating-bacula-from-mysql-to-postgresql/</id><summary type="html">&lt;p&gt;So I've been looking to migrate my bacula installation from MySQL to PostgreSQL. Personally I like PostgreSQL better and the claims on the bacula-users list were that it's faster. So I did a bunch of reading, and then testing the database conversion and finally have made it through the process …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So I've been looking to migrate my bacula installation from MySQL to PostgreSQL. Personally I like PostgreSQL better and the claims on the bacula-users list were that it's faster. So I did a bunch of reading, and then testing the database conversion and finally have made it through the process. Here is the results of how to do it. The system that I did the migration on is an OpenSUSE 11.2 system.&lt;/p&gt;
&lt;p&gt;I first upgraded my install from bacula 3.0.3 to 5.0.0, still using MySQL. This was a pretty straightforward process. A little different because the packing of the RPMS changed between 3.0.3 and 5.x.&lt;/p&gt;
&lt;p&gt;Backup my existing config files and the database.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tar -czf /root/bacula-backup.tar.gz /etc/bacula
mysqldump -u bacula -ppassword bacula &amp;gt; bacula-3.0-mysql.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Remove the old RPMs&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zypper remove bacula bacula-bat bacula-updatedb bacula-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install the new RPMs&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zypper install bacula-console bacula-console-bat bacula-director-mysql bacula-storage-mysql bacula-client bacula-director-mysql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Update the database&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/usr/lib/bacula/update_mysql_tables -u bacula -ppassword bacula
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The next step was the hard one, converting the database. I used a &lt;a href="http://www.mail-archive.com/bacula-users@lists.sourceforge.net/msg40993.html"&gt;post from the bacula-users list&lt;/a&gt; to come up with the appropriate mysqldump line. I then repeatedly created the postgreSQL database and tried to import the dump until it imported without serious errors. In the end this is the pipeline that created a good dump:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mysqldump -t -n -c --compatible=postgresql --skip-quote-names --skip-opt --disable-keys --lock-tables -u bacula -ppassword bacula   
 | grep -v &amp;quot;INSERT INTO Status&amp;quot;   
 | sed -e &amp;#39;s/0000-00-00 00:00:00/1970-01-01 00:00:00/g&amp;#39;   
 | sed -e &amp;#39;s/\\0//&amp;#39; &amp;gt; fixed-bacula-backup.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The mysqldump line is pretty much what was in the mailing list post, except that I did all of the tables at once. The grep is to get rid of inserts into the status table. I was having issues with duplicate keys and such and the bacula-users list assured me that this table is created by the make_postgresql_tables script. The first sed line is to fix some bad dates. MySQL allows a date of all zeros, PostgreSQL doesn't, so I just bumped the 0 dates to the beginning of the unix epoch. The second sed line removes the extra null characters that showed up on all of the inserts into the log table. I'm not sure what caused these, but PostgreSQL doesn't like to import them and this made it much happier.&lt;/p&gt;
&lt;p&gt;I then setup a .pgpass file in root's home directory so that I could secure the postgreSQL database with a password and not put it in my bacula config files. You can learn about the pgpass file in the &lt;a href="http://www.postgresql.org/docs/current/static/libpq-pgpass.html"&gt;postgreSQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next it's just a matter of creating the PostgreSQL tables as the postgres user (or some other user with postgresql superuser privileges)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./create_postgresql_database
./make_postgresql_tables
./grant_postgresql_privileges
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then loading in the data. This load took a little over an hour and a half on my system, so be prepared to wait a bit.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;psql -Ubacula bacula &amp;lt; fixed-bacula-backup.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now one needs to reset the sequences that postgreSQL uses to autocreate ids. I started with the instructions in the &lt;a href="http://www.bacula.org/manuals/en/catalog/catalog/Installi_Configur_PostgreS.html#1107"&gt;bacula manual&lt;/a&gt;, but needed to add a couple of missing sequences.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;basefiles_baseid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;basefiles&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;client_clientid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;file_fileid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename_filenameid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filenameid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fileset_filesetid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filesetid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fileset&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;job_jobid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jobmedia_jobmediaid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobmediaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jobmedia&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;media_mediaid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mediaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;path_pathid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;path&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;basefiles_baseid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;basefiles&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;client_clientid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;file_fileid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename_filenameid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filenameid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fileset_filesetid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filesetid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fileset&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;job_jobid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jobmedia_jobmediaid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobmediaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jobmedia&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;media_mediaid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mediaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;path_pathid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;path&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="n"&gt;VAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pool_poolid_seq&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;poolid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Updates I needed to add:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;device_deviceid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deviceid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;device&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;location_locationid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;locationid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;locationlog_loclogid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loclogid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;locationlog&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;log_logid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;logid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;mediatype_mediatypeid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediatypeid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mediatype&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SETVAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;storage_storageid_seq&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After that I needed to modify the Catalog section in my bacula-dir.conf file to use localhost for the "DB Address", remove the mysql socket reference and remove the password reference.&lt;/p&gt;
&lt;p&gt;I also needed to modify the backup catalog command to be this (all on one line):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;RunBeforeJob = &amp;quot;/usr/lib/bacula/make_catalog_backup bacula bacula \&amp;quot;\&amp;quot; localhost&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Blog"/><category term="bacula"/><category term="MySQL"/><category term="PostgreSQL"/><category term="Programming"/></entry><entry><title>Computer companies being cheap can be annoying</title><link href="https://mtu.net/~jpschewe/blog/2010/06/computer-companies-being-cheap-can-be-annoying/" rel="alternate"/><published>2010-06-15T22:09:00-05:00</published><updated>2010-06-15T22:09:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-06-15:/~jpschewe/blog/2010/06/computer-companies-being-cheap-can-be-annoying/</id><summary type="html">&lt;p&gt;I have a 15" Macbook Pro unibody for work. Recently I was looking at the hard drive specs as I needed to upgrade another users laptop. Turns out that the SATA controller is capable of 3Gbps, however the drive from Apple is only capable of 1.5Gbps. What's really annoying …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have a 15" Macbook Pro unibody for work. Recently I was looking at the hard drive specs as I needed to upgrade another users laptop. Turns out that the SATA controller is capable of 3Gbps, however the drive from Apple is only capable of 1.5Gbps. What's really annoying about this is that I specifically requested a 7200RPM drive from Apple to get some extra performance. Granted that the interface usually isn't the bottleneck here, but still it's annoying.&lt;/p&gt;</content><category term="Blog"/><category term="apple"/><category term="Programming"/></entry><entry><title>Don't change 2 things at once</title><link href="https://mtu.net/~jpschewe/blog/2010/06/dont-change-2-things-at-once/" rel="alternate"/><published>2010-06-09T02:03:00-05:00</published><updated>2010-06-09T02:03:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-06-09:/~jpschewe/blog/2010/06/dont-change-2-things-at-once/</id><summary type="html">&lt;p&gt;So I'm working on a project that has a number of components to it. In particular the data is all stored in a MySQL database. For various reasons we wanted to convert this to a PostgreSQL database. So off I went working on a branch to make the changes and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So I'm working on a project that has a number of components to it. In particular the data is all stored in a MySQL database. For various reasons we wanted to convert this to a PostgreSQL database. So off I went working on a branch to make the changes and test the system. Meanwhile other parts of the system are changing as well, in particular the size of the input data. When it comes time to merge I get everything setup and then merge the changes in and all the tests pass, so I commit.&lt;/p&gt;
&lt;p&gt;Then we notice that the nightly performance run on the continuous integration server is really slow, taking 2 hours instead of 15 minutes. We had noticed there being some slowness on logins  before, but now the logins were slow and the software being tested was really slow. So we go about testing the CI server and find that openSUSE has been kind enough to keep track of the MAC address from the original system (we had installed on a different drive and chassis and then moved to this identical chassis). This caused the IPv6 link local address of this machine to match that of the previous system, which happened to be on the same network. This is bad, so we changed the settings back to the right MAC address and things were better, but still slow. So we decided to reinstall the OS, there are only a couple of directories of data to save, so no big deal.&lt;/p&gt;
&lt;p&gt;After the reinstall, logins are faster, but the performance test is still slow. So we blame this on the changes to the input data. So over the next month or so we optimize the handling of the input data and find ways to reduce the input data some, but not back to the original size. The performance test is better, but still not back where it should be, we're down to about 1.5 hours now.&lt;/p&gt;
&lt;p&gt;Other tasks kept me busy, so I didn't get back to this for another couple of weeks. At that point I'm running the performance test on another development machine and it's running in 15 minutes! This is great! But it's still running slow on the CI server. What's different? So I start checking versions of software and all and everything matches up. What I do notice is differences in the drives. So I get another drive installed in the CI server so I can test different configurations of drives for the PostgreSQL data directory. Here are the results:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;XFS (logbufs=8): ~4 hours to finish
ext4: ~1 hour 50 minutes to finish
ext3: 15 minutes to finish
ext3 on LVM: 15 minutes to finish
reiserfs: ~1 hour 50 minutes
ext3 barrier=1: ~15 minutes
ext4 nobarrier: ~15 minutes
jfs: ~15 minutes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So as you can see, the filesystem really makes a difference. Turns out the development machine was using ext3 on LVM and the CI server was running ext4. After posting to the postgres-performance mailing list about this, it turns out that I either get speed or safety. With ext3, if the power goes out, I could have a corrupted database, with ext4 this isn't likely to happen. Given that I'm doing research here and if the power goes out during a test we have a lot bigger problems, I switched to ext3 and left it at that.&lt;/p&gt;
&lt;p&gt;Now if I had just changed one thing (the database), rather than the database, the input data and the CI server setup around the same time, I probably would have caught this much sooner. It also would help to have my development systems setup with not only the same software, but the same filesystems too.&lt;/p&gt;</content><category term="Blog"/><category term="PostgreSQL"/><category term="Programming"/></entry><entry><title>About Me</title><link href="https://mtu.net/~jpschewe/blog/2010/06/about/" rel="alternate"/><published>2010-06-08T12:39:00-05:00</published><updated>2010-06-08T12:39:00-05:00</updated><author><name>Jon Schewe</name></author><id>tag:mtu.net,2010-06-08:/~jpschewe/blog/2010/06/about/</id><summary type="html">&lt;p&gt;Jon Schewe is an alumnus of &lt;a href="http://www.mtu.edu/"&gt;Michigan Technological University&lt;/a&gt;. I graduated in 1998 with a BS in &lt;a href="http://www.cs.mtu.edu/"&gt;Computer Science&lt;/a&gt;. I'm currently working for &lt;a href="http://www.bbn.com/"&gt;BBN&lt;/a&gt; as a research scientist. For those that may be interested, my resume is available upon request.&lt;/p&gt;
&lt;p&gt;What does it mean to be a "Research Scientist"? Well …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jon Schewe is an alumnus of &lt;a href="http://www.mtu.edu/"&gt;Michigan Technological University&lt;/a&gt;. I graduated in 1998 with a BS in &lt;a href="http://www.cs.mtu.edu/"&gt;Computer Science&lt;/a&gt;. I'm currently working for &lt;a href="http://www.bbn.com/"&gt;BBN&lt;/a&gt; as a research scientist. For those that may be interested, my resume is available upon request.&lt;/p&gt;
&lt;p&gt;What does it mean to be a "Research Scientist"? Well, it means I write lots of software that does of different things. I write software that controls oil refineries, I write network security software, I write software that controls robots. Some of my software runs on PCs, some on servers and some on embedded devices. Usually the software I write isn't going to be in a product for 3 to 5 years, if at all. It's fun to be a research scientist because I get lots of new challenges each day and I usually get a new project (or two) every year.&lt;/p&gt;</content><category term="Blog"/></entry></feed>