<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Joe Nicosia]]></title>
  <link href="http://joet3ch.com/atom.xml" rel="self"/>
  <link href="http://joet3ch.com/"/>
  <updated>2012-03-21T16:46:20-04:00</updated>
  <id>http://joet3ch.com/</id>
  <author>
    <name><![CDATA[Joe Nicosia]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Using EC2 Auto-Scaling Groups with Fabric]]></title>
    <link href="http://joet3ch.com/blog/2012/01/18/Fabric-EC2/"/>
    <updated>2012-01-18T20:00:00-05:00</updated>
    <id>http://joet3ch.com/blog/2012/01/18/Fabric-EC2</id>
    <content type="html"><![CDATA[<p>Trying to deploy fabric recipes to an auto-scaling group on EC2 could prove pretty painful, except if you have this slick code snippet to define your server group in Fabric.</p>

<div><script src='https://gist.github.com/1636904.js?file='></script>
<noscript><pre><code>
def web_cluster():
    env.user = 'ubuntu'
    env.key_filename = ['mykey.pem']
    env.conftype = 'prod'
    env.project = 'sample'

    ec2conn = ec2.connection.EC2Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
    web_group = ec2conn.get_all_security_groups(groupnames=['web'])
    for i in web_group[0].instances():
        env.hosts.append(i.__dict__['public_dns_name'])</code></pre></noscript></div>


<p>Basically I&#8217;m using boto to list all of the instances currently running in a specific security group, and then populate env.hosts.</p>

<p>This solves the problem for pushing to running hosts. In order to pull the latest codebase when a new instance fires up, we just stuck some scripts in /etc/rc.local &#8211; more on that later.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Monitoring your API with Python and SES]]></title>
    <link href="http://joet3ch.com/blog/2012/01/18/API-Monitoring/"/>
    <updated>2012-01-18T10:26:00-05:00</updated>
    <id>http://joet3ch.com/blog/2012/01/18/API-Monitoring</id>
    <content type="html"><![CDATA[<p>I needed a quick and simple script to monitor some of the API&#8217;s I manage. Since I already build in methods that fully test the webservice and backend database, I just had to wrap a single call and check the results from this method. Also I don&#8217;t want to rely on my servers being able to send mail, so I added support for AWS SES.</p>

<p>And the code&#8230;</p>

<div><script src='https://gist.github.com/1633507.js?file='></script>
<noscript><pre><code>#!/usr/bin/env python

import os
import sys
import time
import random
import string
import json
import hashlib
import socket
import urllib
import urllib2
from operator import itemgetter
from pprint import pprint
import StringIO

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

import boto
from boto.ses import SESConnection

## config
AWS_ACCESS_KEY = 'XXX'
AWS_SECRET_KEY = 'XXX'
TO_ADDRESS = 'XXX@example.com'
FROM_ADDRESS = 'XXX@example.com'
API_ENDPOINT = 'http://example.com/api/system/health'

def send_alert(subject, body):    
    ## ses connect
    try:
        ses = SESConnection(AWS_ACCESS_KEY, AWS_SECRET_KEY)
        result = ses.send_email(FROM_ADDRESS, subject, body, TO_ADDRESS)
        return True
    except:
        return False

def test_api():
    subject = 'ALERT: api outage'
    try:
        url = API_ENDPOINT
        headers = {}
        params = {}
        url = url + '?' + urllib.urlencode(params)
        req = urllib2.Request(url, None, headers)
        response = json.load(urllib2.urlopen(req))
        if response['meta']['status'] != 'OK':
            send_alert(subject, 'api not OK')
    except:
        send_alert(subject, 'api call failed')
    return True
    
def main():
    test_api()
    
if __name__ == '__main__':
    sys.exit(main())</code></pre></noscript></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A few minutes with DNSCrypt]]></title>
    <link href="http://joet3ch.com/blog/2011/12/08/dnscrypt/"/>
    <updated>2011-12-08T17:58:00-05:00</updated>
    <id>http://joet3ch.com/blog/2011/12/08/dnscrypt</id>
    <content type="html"><![CDATA[<p>I checked out <a href="http://www.opendns.com/technology/dnscrypt/" title="DNSCrypt" target="_blank">DNSCrypt</a> today, a new tool to help secure DNS resolution by encrypting the lookups from your machine to the DNS server.</p>

<p><img src="http://joet3ch.com/static/images/dnscrypt-window.png" title="'dnscrypt window'" ></p>

<p>The tool was developed by <a href="http://www.opendns.com" title="OpenDNS" target="_blank">OpenDNS</a> and is currently a preview release.</p>

<p>I just wanted to see the DNS traffic, so I performed a few lookups while capturing the packets&#8230;</p>

<p><img src="http://joet3ch.com/static/images/shell-history.png" title="'shell history'" ></p>

<p>Here is an example of a non-encrypted query:</p>

<p><img src="http://joet3ch.com/static/images/dns-query-normal-wireshark.png" title="'dns normal'" ></p>

<p>And an encrypted query:</p>

<p><img src="http://joet3ch.com/static/images/dns-query-dnscrypt-nonssl-wireshark.png" title="'dnscrypt nonssl'" ></p>

<p>If you enable the lookups to traverse port 443, there will be tons of packets and I didn&#8217;t look at them.</p>

<p>One note worth mentioning &#8211; The client app creates a bunch of connections back to OpenDNS whenever you modify the settings.</p>

<p>This is some great technology and it is open-sourced. I&#8217;m assuming the networks who want total control of their users will just block the OpenDNS IP blocks to prevent users from encrypting their lookups.</p>

<p>You can fetch the source on <a href="http://www.github.com/opendns" title="DNSCrypt Source" target="_blank">GitHub</a> &#8211; The entire Mac OS app is there!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Securing Mac OS]]></title>
    <link href="http://joet3ch.com/blog/2011/12/02/securing-mac-os/"/>
    <updated>2011-12-02T09:11:00-05:00</updated>
    <id>http://joet3ch.com/blog/2011/12/02/securing-mac-os</id>
    <content type="html"><![CDATA[<p>Mac OS is great, but is not 100% secure.. Nothing is.</p>

<p>In addition to using the built-in security features (ie. FileVault), I run 3rd party anti-virus and firewall tools. This helps me trust my machine a little bit more.</p>

<p><a href="http://www.obdev.at/products/littlesnitch/index.html" title="Little Snitch" target="_blank">Little Snitch</a> is a firewall and network monitor for Mac OS. It allows you to permit or deny any network connection on a temporary or permanent basis. There is also a network monitor window that displays all of your current connections.</p>

<p><img src="http://joet3ch.com/static/images/little_snitch.png" title="'Little Snitch'" ></p>

<p><a href="http://www.sophos.com/en-us/products/free-tools/sophos-antivirus-for-mac-home-edition.aspx" title="Sophos Anti-Virus" target="_blank">Sophos Anti-Virus</a> is an anti-virus tool that actively monitors your machine for malware. This is a free tool and has proved to detect virii not only for Mac OS, but other platforms as well (such as Windows and Linux).</p>

<p><img src="http://joet3ch.com/static/images/sophos.png" title="'Sophos Anti-Virus'" ></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testing ...]]></title>
    <link href="http://joet3ch.com/blog/2011/11/01/testing-dot-dot-dot/"/>
    <updated>2011-11-01T20:01:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/11/01/testing-dot-dot-dot</id>
    <content type="html"><![CDATA[<p>Testing Octopress -> Feedburner -> Twitter</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Goodbye Wordpress. Hello Octopress.]]></title>
    <link href="http://joet3ch.com/blog/2011/11/01/goodbye-wordpress-hello-octopress/"/>
    <updated>2011-11-01T19:42:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/11/01/goodbye-wordpress-hello-octopress</id>
    <content type="html"><![CDATA[<p>It&#8217;s Jekyll, but without all of the work.</p>

<p><img src="http://joet3ch.com/static/images/octopress.png" title="'Octopress Logo'" ></p>

<p><a href="https://github.com/imathis/octopress">Octopress source on GitHub</a></p>

<p><a href="http://octopress.org">Octopress Home</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Lets Talk iPhone]]></title>
    <link href="http://joet3ch.com/blog/2011/10/04/lets-talk-iphone/"/>
    <updated>2011-10-04T13:56:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/10/04/lets-talk-iphone</id>
    <content type="html"><![CDATA[<p><img src="http://joet3ch.com/static/images/apple-iphone-event.jpg" title="'Apple iPhone Event'" ></p>

<p>The rumors will finally be put to rest today at 1pm eastern.</p>

<p>I usually follow the Apple events at Engadget&#8217;s liveblog: <a href="http://www.engadget.com/2011/10/04/apples-lets-talk-iphone-keynote-liveblog/" title="http://www.engadget.com/2011/10/04/apples-lets-talk-iphone-keynote-liveblog/" target="_blank">http://www.engadget.com/2011/10/04/apples-lets-talk-iphone-keynote-liveblog/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Install Python Modules via GitHub]]></title>
    <link href="http://joet3ch.com/blog/2011/09/17/install-python-modules-via-github/"/>
    <updated>2011-09-17T02:32:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/09/17/install-python-modules-via-github</id>
    <content type="html"><![CDATA[<p><a href="http://pypi.python.org/pypi/pip" title="pip" target="_blank">pip</a> is a nice replacement for easy_install. And you can install Python modules from <a href="http://github.com" title="GitHub" target="_blank">GitHub</a> (or any git repo) with pip.</p>

<p>Here is an example:</p>

<div><script src='https://gist.github.com/1332530.js?file='></script>
<noscript><pre><code>$ sudo pip install -e git://github.com/joet3ch/foursquare-python.git#egg=foursquare
Obtaining foursquare from git+git://github.com/joet3ch/foursquare-python.git#egg=foursquare
  Cloning git://github.com/joet3ch/foursquare-python.git to ./src/foursquare
  Running setup.py egg_info for package foursquare
Installing collected packages: foursquare
  Running setup.py develop for foursquare
    Creating /usr/local/lib/python2.6/dist-packages/foursquare.egg-link (link to .)
    Adding foursquare 0.1 to easy-install.pth file
    
    Installed /home/ubuntu/src/foursquare
Successfully installed foursquare
Cleaning up...
$
</code></pre></noscript></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Alternative Tornado Logging]]></title>
    <link href="http://joet3ch.com/blog/2011/09/08/alternative-tornado-logging/"/>
    <updated>2011-09-08T01:52:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/09/08/alternative-tornado-logging</id>
    <content type="html"><![CDATA[<p><a href="http://www.tornadoweb.org/">Tornado</a> uses the standard logging library, by default, and sends logs to STDOUT. Sometimes you may want logs stored in a database or flat-file.</p>

<h4></h4>


<br /><br />


<h4>Logging to flat-files</h4>


<p>This method is fairly simple. You could pass the &#8216;log_file_prefix&#8217; parameter via the command-line, or more elegantly add the options in your code:</p>

<div><script src='https://gist.github.com/1332512.js?file='></script>
<noscript><pre><code>tornado.options.options['log_file_prefix'].set('/opt/logs/my_app.log')
tornado.options.parse_command_line()
</code></pre></noscript></div>


<p>If you have multiple instances of the same app running, I would keep the logs separate by using the port number:</p>

<div><script src='https://gist.github.com/1332514.js?file='></script>
<noscript><pre><code>tornado.options.options['log_file_prefix'].set('/opt/logs/my_app.log' + str(PORT))
</code></pre></noscript></div>




<h4></h4>


<h4>Storing logs in a MongoDB collection</h4>


<p>MongoLog is a really cool open-source centralized logging module for Python and MongoDB. It&#8217;s available on Github at <a href="https://github.com/andreisavu/mongodb-log">https://github.com/andreisavu/mongodb-log</a>.</p>

<p>Follow the installation docs in the README to get MongoLog all setup. After cloning and installing MongoLog, we need to modify our Tornado app.</p>

<p>First, import MongoLog:</p>

<div><script src='https://gist.github.com/1332515.js?file='></script>
<noscript><pre><code>import logging
from mongolog.handlers import MongoHandler
</code></pre></noscript></div>


<p>Next we will override the &#8216;Application.log_request&#8217; method to implement MongoLog.</p>

<div><script src='https://gist.github.com/1332516.js?file='></script>
<noscript><pre><code>    def log_request(self, handler):

        log = logging.getLogger('demo')
        log.setLevel(logging.DEBUG)
        log.addHandler(MongoHandler.to(db='mongolog', collection='log', host='db.example.com'))

        if handler.get_status() &amp;lt; 400:
            log_method = log.info
        elif handler.get_status() &amp;lt; 500:
            log_method = log.warn
        else:
            log_method = log.error

        request_time = 1000.0 * handler.request.request_time()
        log_message = '%d %s %.2fms' % (handler.get_status(), handler._request_summary(), request_time)
        log_method(log_message)
</code></pre></noscript></div>


<p>After everything is up and running, you can view the raw logs in the database or use the web ui that ships with MongoLog:</p>

<p><img src="http://joet3ch.com/static/images/MongoDB-Centralized-Logging2.png" title="'MongoLog WebUI'" ></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New Workspace]]></title>
    <link href="http://joet3ch.com/blog/2011/09/02/new-workspace/"/>
    <updated>2011-09-02T02:01:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/09/02/new-workspace</id>
    <content type="html"><![CDATA[<p>Customized Galant from Ikea with lots of shiny Apple goodness.</p>

<br /><br />


<p><img src="http://joet3ch.com/static/images/7E5AA8B4-2CF9-4D4C-82A1-F2C56E4901770.jpg" title="'My workstation'" ></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Dream Apple Machine]]></title>
    <link href="http://joet3ch.com/blog/2011/08/28/my-dream-apple-machine/"/>
    <updated>2011-08-28T16:59:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/08/28/my-dream-apple-machine</id>
    <content type="html"><![CDATA[<p>An extra-wide touchpad and dual detachable iPad displays on a MacBook Pro. Wow! Add 32GB of RAM and quad SSD RAID too. I&#8217;m not sure why they left the optical drive in this mockup, that has got to go. Lets hope Apple is really brewing this, I will camp out on the street for this one!</p>

<p><img src="http://joet3ch.com/static/images/NewImage.png" title="'Dream apple device'" ></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hurricane Irene - Testing Our Infrastructure]]></title>
    <link href="http://joet3ch.com/blog/2011/08/28/hurricane-irene-testing-our-infrastructure/"/>
    <updated>2011-08-28T16:50:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/08/28/hurricane-irene-testing-our-infrastructure</id>
    <content type="html"><![CDATA[<p>The past 24 hours have been filled with a lot of media hype, some rain, some wind, and a few darwin awards. In my home at the Jersey Shore we still have a &#8216;situation&#8217; &#8211; no electricity.</p>

<p>Luckily we are served well by Twitter and can find out storm details by fellow local internet users, thank you Twitter.</p>

<p>Internet access has remained available, thanks to the awesome local ISPs and UPS units on our modems.</p>

<p>Amazon Web Services seemed to have no outages during this storm, thank you AWS.</p>

<p>Thank you also to AT&amp;T and Verizon for keeping our cellular services online. I&#8217;m posting this via a tethered iPhone.</p>

<p>However the electricity infrastructure has proved to be unable to handle single points of failure. We are on day 2 of no power, thanks to a broken transformer miles away.</p>

<p>1 - Why don&#8217;t we have high-availability redundant infrastructure?</p>

<p>2 - Why don&#8217;t we have safer, less vulnerable, underground power lines?</p>

<p>We need to develop a redundant system like the internet for our electric. I won&#8217;t hold my breath. For now I&#8217;ll take it into my own hands and outfit my place with solar and diesel backup solutions.</p>

<p>Thank you Irene for testing our infrastructure.</p>

<p>Update: I just ordered this generator so I can keep writing code during power outages.</p>

<p><a href="http://www.amazon.com/gp/product/B002RWK9N2/ref=as_li_ss_tl?ie=UTF8&tag=t3co-20&linkCode=as2&camp=217145&creative=399369&creativeASIN=B002RWK9N2">Yamaha EF2000iS 2,000 Watt 79cc OHV 4-Stroke Gas Powered Portable Inverter Generator (CARB Compliant)</a><img src="http://www.assoc-amazon.com/e/ir?t=&l=as2&o=1&a=B002RWK9N2&camp=217145&creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Workstation and Network Infrastructure]]></title>
    <link href="http://joet3ch.com/blog/2011/08/24/my-workstation-and-network-infrastructure/"/>
    <updated>2011-08-24T18:55:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/08/24/my-workstation-and-network-infrastructure</id>
    <content type="html"><![CDATA[<p>This is where I spend most of my time &#8230;</p>

<p><img src="http://joet3ch.com/static/images/DSCN1611.jpg" title="'Icon Pillows'" ></p>

<p>My primary workstation is a MacBook Pro 17&#8221; with i7 CPU, 8GB RAM, 256GB SSD and a 27&#8221; Apple Cinema Display. I use an Apple bluetooth keyboard and Magic Trackpad.</p>

<p>I also use a MacBook Pro 15&#8221; for testing security related stuff that I don&#8217;t want to pollute my main workstation with.</p>

<p><img src="http://joet3ch.com/static/images/DSCN1615.jpg" title="'Workstation'" ></p>

<p>In the background of my view are 2 Samsung displays. On the bottom is a 52&#8221; and above is a 24&#8221; that I use for displaying network monitoring and analytics info. Below the monitors is a Mac Mini running Lion Server, a Drobo with 8TB of storage, an Apple Airport Extreme, APC UPS and my dusty Xbox.</p>

<p><img src="http://joet3ch.com/static/images/DSCN1626.jpg" title="'Infrastructure'" ></p>

<p>Lets dissect my network infrastructure&#8230;</p>

<p>Dual internet connections with 1 DOCSIS v3.0 modem and 1 DOCSIS v2.0 modem.</p>

<p>Protecting my network are 2 security appliances, a Cisco ASA 5505 and a custom built pfsense box.</p>

<p>The core is a HP ProCurve 1810G-24 switch that sits on top of my retired Cisco 3500 WS-C3548-XL-EN Switch.</p>

<p>My primary wireless network is powered by an Apple Aiport Extreme, and I run a Buffalo WHR-HP-G300N router with OpenWRT for guests.</p>

<p>Most of my servers are EC2 instances running on Amazon Web Services. However I do use a Dell PowerEdge 1950 server with VMWare ESXi for local testing.</p>

<p>Also in the rack is a Samsung 17&#8221; CRT Monitor, 2 Belkin KVM switches, a Foscam FI8918W IP camera and a Belkin UPS.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Wordpress App for iOS Devices]]></title>
    <link href="http://joet3ch.com/blog/2011/07/30/wordpress-app-for-ios-devices/"/>
    <updated>2011-07-30T11:29:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/07/30/wordpress-app-for-ios-devices</id>
    <content type="html"><![CDATA[<p>Testing out the official Wordpress app for iOS.</p>

<p>So far, I think there is some primary functionality lacking&#8230;  There is no way to save a draft post. And the post editor is very simple.</p>

<p>I attempted to paste an image into this post with no luck.</p>

<p>I do value the simplicity but would like to be able to save drafts and embed images in the posts from my iPad and iPhone.</p>

<p>As I am typing this last line, I can&#8217;t even see it since the post editor does not scroll up. I had to rotate into portrait mode to finish this. I hope there are more Wordpress apps to choose from!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Static Websites]]></title>
    <link href="http://joet3ch.com/blog/2011/07/30/static-websites/"/>
    <updated>2011-07-30T02:13:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/07/30/static-websites</id>
    <content type="html"><![CDATA[<p>It&#8217;s been over a decade since I touched a static website. After <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?WebsiteHosting.html">Amazon announced website endpoint support for S3</a>, I wanted to give it a try since the benefits are pretty appealing.</p>

<br /><br />


<p>A static website eliminates the databases and serverside code execution.</p>

<br /><br />


<p>Hosting a static site on Amazon S3 eliminates supporting the web server, load balancing, caching, etc.</p>

<br /><br />


<p>By switching from a common cms system such as Wordpress, your most likely to gain a lot of speed and lower the possibility of security vulnerabilities.</p>

<br /><br />


<p>A con for some users is that your only option for increasing functionality is to write JavaScript and let it run clientside. For a blog, this is perfect in my opinion.</p>

<br /><br />


<p>The tools I used to create a full featured static blog:</p>

<br /><br />


<p><a href="http://solovyov.net/cyrax/">Cyrax</a> generates the static site (python / Jinja2 templates)</p>

<br /><br />


<p><a href="http://s3.amazon.com">Amazon S3</a> serves the HTML and JavaScript</p>

<br /><br />


<p><a href="http://flickr.com">Flickr</a> for photo hosting (could do this with S3, but I like the iPhoto integration with Flickr)</p>

<br /><br />


<p><a href="http://feedburner.com">Feedburner</a> serves the rss and publishes new posts to Twitter via <a href="http://www.google.com/support/feedburner/bin/answer.py?hl=en&answer=167800">Feedburner Socialize</a></p>

<br /><br />


<p><a href="http://disqus.com">Disqus</a> handles the user commenting system</p>

<br /><br />


<p><a href="http://analytics.google.com">Google Analytics</a> takes care of traffic analysis</p>

<br /><br />


<p>In the end, I am sticking with Wordpress for T3CH.com. For simpler blogs, I&#8217;d definitely consider using Cyrax.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[After Upgrading to Mac OS Lion (workstation and server)]]></title>
    <link href="http://joet3ch.com/blog/2011/07/24/after-upgrading-to-mac-os-lion-workstation-and-server/"/>
    <updated>2011-07-24T01:58:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/07/24/after-upgrading-to-mac-os-lion-workstation-and-server</id>
    <content type="html"><![CDATA[<pre><code>&lt;p&gt;I upgraded 2 machines to Mac OS Lion yesterday. The download is not fast and the file is almost 4GB. So it's a good idea to save a copy of the installer app after it finishes downloading. That file will be auto-deleted after the Lion upgrade. Then you'll be able to create usb installer disks and upgrade other machines while saving bandwidth.
</code></pre>

<br /><br /></p>


<p>First up was the MacBook Pro 17 (my primary workstation). The upgrade was seamless and I have no complaints. I disabled Spotlight indexing since it was lagging the system, now it&#8217;s super snappy.
<br /><br /></p>


<p>Next I upgraded a Mac Mini (my primary server). The Mac Mini was at a different physical location, so I performed the upgrade via Apple Remote Desktop. Since the box was already running Mac OS 10.6 Server, the App Store forced me to purchase both Mac OS Lion and the new Server app&#8230; which I expected.
<br /><br /></p>


<p><a href="http://www.flickr.com/photos/joet3ch/5970705747/" title="Mac OS Lion Server Upgrade Complete by joet3ch, on Flickr"><img src="http://farm7.static.flickr.com/6121/5970705747_b83871874f_z.jpg" width="640" height="492" alt="Mac OS Lion Server Upgrade Complete"></a></p>


<p><br /><br /></p>


<p>The server upgrade did take a bit more effort. Here are the issues that I had to deal with:
<br /><br />
- I was charged for Mac OS Lion upgrade twice. I emailed the App Store and received a refund less than 1 hour later.
<br /><br /></p>


<p><a href="http://www.flickr.com/photos/joet3ch/5970706113/" title="Mac OS Lion Server purchase by joet3ch, on Flickr"><img src="http://farm7.static.flickr.com/6028/5970706113_3d45fe83ec_z.jpg" width="640" height="546" alt="Mac OS Lion Server purchase"></a></p>


<p><br /><br />
- WebDAV is broken. The settings are there (they have been moved from the Web Server config screen to the File Sharing config), but it just doesn&#8217;t function&#8230; I tested with cadaver and it would not work. Instead of spending the whole night banging my head on this issue, I setup WebDAV with Apache in a Linux VM.
<br /><br />
- FTP server is gone. Yeah FTP isn&#8217;t ideal, but I do have some devices which only support offloading files via FTP. This bugs me, but I&#8217;ll use vsFTPd in a Linux VM instead.
<br /><br />
- The config options are lacking. In 10.6 there were way more settings and configurable options available in the Server Manager app. Here is an example of the Web Server settings gui:
<br /><br /></p>


<p><a href="http://www.flickr.com/photos/joet3ch/5970722595/" title="Mac OS Lion Web Server Settings by joet3ch, on Flickr"><img src="http://farm7.static.flickr.com/6128/5970722595_74508346be_z.jpg" width="640" height="600" alt="Mac OS Lion Web Server Settings"></a></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Before You Upgrade To Mac OS Lion]]></title>
    <link href="http://joet3ch.com/blog/2011/07/23/before-you-upgrade-to-mac-os-lion/"/>
    <updated>2011-07-23T01:57:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/07/23/before-you-upgrade-to-mac-os-lion</id>
    <content type="html"><![CDATA[<p><a href="http://apple.com/lion">Mac OS Lion</a> was officially released earlier this week and I have been holding off on the upgrade since I didn&#8217;t want to disturb any of the projects that I was working on. Well now the weekend is here and I am ready to give it a spin! FWIW, I have been running developer beta releases of Lion on a spare MacBookPro but now I want the final release on my production workstation.
<br /><br />
Before you upgrade, it&#8217;s a MUST to check the <a href="http://roaringapps.com/apps:table">RoaringApps App Compatibility List</a> and compare all of your apps to see which ones will work and which ones will not. This list is built by the community and is the most critical tool in determining if your ready to upgrade.
<br /><br />
<a href="http://www.flickr.com/photos/joet3ch/5966856021/" title="roaring_apps by joet3ch, on Flickr"><img src="http://farm7.static.flickr.com/6126/5966856021_a9ebdc3b64_z.jpg" width="640" height="355" alt="roaring_apps"></a>
<br /><br />
Another MUST is to create a clone of your existing system, I use <a href="http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html">SuperDuper!</a>. If your upgrade fails, SuperDuper makes it simple to roll back the system state quickly.
<br /><br />
<a href="http://www.flickr.com/photos/joet3ch/5966881513/" title="SuperDuper! by joet3ch, on Flickr"><img src="http://farm7.static.flickr.com/6011/5966881513_8e24a34360_z.jpg" width="540" height="250" alt="SuperDuper!"></a>
<br /><br />
Ok, I am ready to go upgrade my box&#8230; And then will be upgrading my Mac OS Servers!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backup Google Voice Messages]]></title>
    <link href="http://joet3ch.com/blog/2011/07/22/backup-google-voice-messages/"/>
    <updated>2011-07-22T01:56:00-04:00</updated>
    <id>http://joet3ch.com/blog/2011/07/22/backup-google-voice-messages</id>
    <content type="html"><![CDATA[<p>I&#8217;ve looked for solutions to automatically download and archive all of my Google Voice voicemail messages, without success.
<br />
<br />
Fortunately I discovered the PyGoogleVoice project (<a href="http://code.google.com/p/pygooglevoice/">http://code.google.com/p/pygooglevoice/</a>). Google Voice for Python allows you to interface with the Google Voice API from within your Python apps.
<br />
<br />
Since I only wanted to download the mp3 files for each of my voicemail messages, I modified the example code to suite my needs. Here is a sanitized copy of my google voice backup script:
<br />
<br /></p>


<pre class="brush: python;">
#!/usr/bin/env python
from googlevoice import Voice
from pprint import pprint

download_dir = '/home/joet3ch/voicemail'

voice = Voice()
voice.login('my_username', 'my_password')

for message in voice.voicemail().messages:
    message.download(download_dir)
    #message.delete()
</pre>




<p><br />
<br />
Uncomment the last line &#8216;message.delete()&#8217; to automatically delete the message from Google&#8217;s servers after your download is complete.
<br />
<br />
To fully automate the backup script, schedule the job with cron. Here is an example that will run the script every day at 1am.</p>


<pre class="brush: bash;">
0 1 * * * /home/joet3ch/scripts/google_voice_backup.py
</pre>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SpendWise - Accepted into The Apple App Store]]></title>
    <link href="http://joet3ch.com/blog/2011/01/20/spendwise-accepted-into-the-apple-app-store/"/>
    <updated>2011-01-20T00:31:00-05:00</updated>
    <id>http://joet3ch.com/blog/2011/01/20/spendwise-accepted-into-the-apple-app-store</id>
    <content type="html"><![CDATA[<p>Our newest app <a href="http://itunes.apple.com/app/spendwise/id415046214?mt=8" target="_blank">SpendWise</a> has been accepted into the Apple App Store!</p>

<p>SpendWise enables you to make purchases with your brain, not your money&#8230;</p>

<p>The review process was super quick:</p>

<p><img src="http://joet3ch.com/static/images/iTunes-Connect-status-history.png" title="'iTunes Connect Status History'" ></p>

<p>It&#8217;s a universal app and will run on iPod Touch, iPhone and iPad devices.  I co-developed SpendWise with <a href="http://superjessi.com" target="_blank">SuperJessi</a>.</p>

<p>View SpendWise at the Apple App Store <a href="http://itunes.apple.com/app/spendwise/id415046214?mt=8" target="_blank">here</a>.</p>

<p>Learn more about SpendWise at: <a href="http://apps.t3ch.com/spendwise" target="_blank">http://apps.t3ch.com/spendwise</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[UPDATED: VDC Power Your App Contest: droplat for Android]]></title>
    <link href="http://joet3ch.com/blog/2011/01/16/updated-vdc-power-your-app-contest-droplat-for-android/"/>
    <updated>2011-01-16T19:21:00-05:00</updated>
    <id>http://joet3ch.com/blog/2011/01/16/updated-vdc-power-your-app-contest-droplat-for-android</id>
    <content type="html"><![CDATA[<p>Verizon is hosting the <a href="http://www.poweryourappcontest.com">Power Your App Contest</a> and <a href="http://dropl.at">droplat</a> for Android has been accepted as an entree.  Vote for us!</p>

<p>I co-developed this app with <a href="http://twitter.com/ipaulpro">ipaulpro</a> of <a href="http://finer.mobi">Finer Mobile</a>.  My primary role involved architecting the backend, this includes the webservice and api.  Paul did a <strong>fabulous</strong> job, as always, on the UI.  Check out his work:</p>

<p><img src="http://joet3ch.com/static/images/droplat-screenshot.png" title="'droplat for Android'" ></p>

<p>Isn&#8217;t that one of the most polished Android apps you have ever seen!?</p>

<p>For those who don&#8217;t know, droplat is a location-based file sharing service that enables users to share files with others nearby.  You can install it on your Android device from the Google Android Market.  The app is still in an &#8216;alpha&#8217; stage, so there may be minor bugs.  We are working hard to roll out new features, so stay tuned for updates.</p>

<p>Learn more about droplat at <a href="http://dropl.at">http://dropl.at</a></p>

<p>UPDATED:  Droplat is now in the semi-finals!  Help us get to the finals by voting for Droplat in the Entertainment category at <a href="http://www.poweryourappcontest.com">Power Your App Contest</a>.</p>

<p><img src="http://joet3ch.com/static/images/2010-VDC-Power-Your-APP-Contest-2.png" title="'VDC Contest'" ></p>

<p><a href="http://www.poweryourappcontest.com"></a></p>

<p><a href="http://dropl.at"></a></p>
]]></content>
  </entry>
  
</feed>

