Tuesday, April 30, 2013

Connecting Python to SQL Server on OSx

After several hours and many frustrating errors, I was able to query SQL Server with Python. Previously, I went through several searches suggesting to install FreeTDS or find ODBC drivers. The steps were usually overly complicated and the instructions produced errors that send me down other tangents.

So here is it simply:
1.  Install pyodbc. (https://code.google.com/p/pyodbc/)
     Make sure the Python version and bit count (32 or 64) match your system.
2. Buy the driver from http://www.actualtech.com/
     I know, buy a driver? But it's $35 and I had it installed and running my test scripts in 5 minutes.
     Given my billable rate the client was happy to pay for it.
     If you're skeptical, you can install the driver for free with a few restrictions.

Here's a sample of my code:

import pyodbc

cnxn = pyodbc.connect('DRIVER={Actual SQL Server};SERVER=127.0.0.1;DATABASE=somedatabase;UID=username;PWD=password')
cursor = cnxn.cursor()

q = cursor.execute("select firstname, lastname from users")
row = cursor.fetchone()
if row:
    print(row)

Wednesday, April 10, 2013

Temp File Cleanup with Python

In the short few months I've been using Python, I've been impressed by it's versitility, performance and small footprint. Here is a quick of example of how to used Python to loop through a directory and delete old files based on the last modified date.

On Windows:

import os, time, sys
from datetime import datetime

path = r"c:\tempFiles" # Target Directory
logfile = r"c:\log\tempFileCleanup.txt"  # Log File
days = 10  # Delete files older than X days

now = time.time()

for f in os.listdir(path):
 full = path + '\\'
 full = full + f
 #print(full)
 #print(os.stat(full).st_mtime)
 if os.stat(full).st_mtime < now - days * 86400:
  if os.path.isfile(full):
   d = os.stat(full).st_mtime
   print(full)
   print(datetime.utcfromtimestamp(d))
   print(" ")
   os.remove(os.path.join(path, f))

# Create the log file if it does not exist
try:
   with open(logfile): pass
except IOError:
 target = open (logfile, 'w')
 target.write("\n")
 target.close()

# Write to the log file
with open(logfile, "r+") as f:
 old = f.read() 
 f.seek(0)
 f.write("Job Complete - " + str(datetime.utcfromtimestamp(now)) + "\n" + old)
   
print("All Done")

Sunday, April 7, 2013

GPS with jQuery Mobile

Having never developed on a mobile platform before, I was very curious about using the GPS feature within a web page. Having seen a "request to access my GPS" when I viewed certain sites, I knew it was possible. After a little research I found it was much easier than I through thanks to jQuery mobile.

You must download jQuery and jQuery mobile. I also used the jQuery mobile css.

Click here for demo


<!DOCTYPE html>
<html>
<head>
<meta name=viewport content="user-scalable=no,width=device-width" />
<link rel=stylesheet href="jquery.mobile-1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="jquery-1.9.1.min.js"></script>
<script src="jquery.mobile-1.3.0/jquery.mobile-1.3.0.js"></script>
</head>
<body>

<div data-role=page id=home>
  <div data-role=header><h1>Where Am I?</h1></div>

  <div data-role=content>
  <span> Status : </span> <span id=stat></span> <br />
    <span> Time : </span> <span id=time></span> <br />
<span> Latitude : </span> <span id=lat></span> <br />
    <span> Longitude : </span> <span id=lng></span> <br />
  </div>

  <input type="button" name="ss" value="" id="ss">

  <div id="out1" style="width:96%; height:200px; overflow:scroll; border:1px solid #000; margin-left:2%;"></div>
</div>

</body>
</html>

<script>
(function($) {

$.fn.changeButtonText = function(newText) {
return this.each(function() {
$this = $(this);
if( $this.is('a') ) {
$('span.ui-btn-text',$this).text(newText);
return;
}
if( $this.is('input') ) {
$this.val(newText);
// go up the tree
var ctx = $this.closest('.ui-btn');
$('span.ui-btn-text',ctx).text(newText);
return;
}
});
};

var runGPS = 0;
$("#ss").changeButtonText('Start');
$("#stat").text('Paused');

$('#ss').click(function() {
if (runGPS == 1){
$("#stat").text('Paused');
$("#ss").changeButtonText('Start');
runGPS = 0;
} else {
$("#stat").text('Running');
$('#ss').changeButtonText("Stop");
runGPS = 1;
}
});

var timer = setInterval(function(){
if (runGPS == 1){
navigator.geolocation.getCurrentPosition (function (pos)
{
date = new Date();
$("#time").text (date);

var lat = pos.coords.latitude;
var lng = pos.coords.longitude;
$("#lat").text (lat);
$("#lng").text (lng);

var t = date + " lat:" + lat + "lng:" + lng + "<br>";

$("#out1").append(t);

});
}
},2000);

})(jQuery);
</script>