Sunday, September 28, 2008

Cron in Python

Cron jobs are traditional time based scheduling service on Unix platforms. For an introduction to cron jobs, go to: http://en.wikipedia.org/wiki/Crontab

At times, different software solutions may need to incorporate cron like functionality. I ended up doing the same recently. As usual, I first tried to find out if there are any existing implementations of cron available so that I do not have to re-invent the wheel again. I was looking for a Python based implementation and found the following: http://sourceforge.net/projects/pycron/ (Python Cron, Great Cron for Windows).

Although the title mentions Windows but the implementation can work on any Python based environment. The software is GPL licensed. Its a small and simple implementation of Cron in Python. The solution is easy to read and understand. It helped me understand some of the intricacies of cron implementation (like matching the cron table information with current time, taking care of system clock issues, etc.).

The algorithm is based on the initial simple implementation of cron by Brian Kernighan.
  1. Read the cron file
  2. Determine if any commands are to be run at the current date and time and if so, run them.
  3. Sleep for one minute
  4. Repeat from step 1.

Friday, August 15, 2008

Unicode Email in Python

Unicode email in Python requires quite good amount of care.

Read http://mg.pov.lt/blog/unicode-emails-in-python to know about it more.

Friday, August 8, 2008

SVN configuration file

Lot of people like me don't know about a configuration file in subversion on the client side which can help in setting up a lot of default options for them. It took me a time to figure it out, so I guess its worth talking about.

The file resides at: %APPDATA%\Subversion\config on Windows systems.

Some of the uses of this file are:
  • Identifying different file extensions which should be ignored by default
  • Identifying different file extensions for which svn:eol-style=native can be set by default.

Working with the SubVersion Config file

In the following I will show you some examples of how you can use this config file to make your life easier.

Global Ignores

Typically when I work on my python projects, a number of *.pyc files are generated when Python compiles my source files. It is annoying to see them listed whenever I run svn update or svn status commands. Fortunately one can specify a set of file name patterns (typically wild-card based) which will be ignored by default.

In your configuration file:

  • Search for a line with keyword global-ignores
  • If the line is commented, un-comment it
  • add a list of file patterns which you wish to ignore

On my side it looks like:

global-ignores = *.o *.lo *.la *.pyc *.obj .DS_Store

VC++ programmers may like to add *.obj, *.exe, *.lib, *.dll etc.

Auto Props

SVN allows you to set some properties on the files. Some of the commonly used ones are svn:externals, svn:eol-style, svn:keywords etc.

I work on multiple platforms (Windows/Mac/Linux). Hence I usually need to check-in my source code with svn:eol-style=native so that when it is checked out on different platforms, the end of line characters are adjusted accordingly. (Read more about it in SubVersion manual).

My problem was that I had to do this manually for each file. Later on I found that its possible to specify in the configuration file a few automatic properties which get attached to a new file the moment its added to SVN repository.

  • Find out a line which has enable-auto-props
  • Make sure its un-commented
  • Make sure that it looks like: enable-auto-props=yes
  • Find out a section [auto-props]
  • For each file pattern of your interest (*.c, *.cpp, *.py), define the automatic properties which you would like to be setup. e.g.: *.py = svn:eol-style=native;svn:keywords=Id
  • You are done!!!

SubClipse and SVN

SubClipse supports two different SVN interfaces. JavaHL and SVNKit. JavaHL uses the same configuration files as the command-line client viz. %APPDATA%\Subversion\. SVNKit caches information in Eclipse keyring. I don't know much about it and won't talk about it. I am happy with JavaHL SVN interface for SubClipse.

I hope this post is useful to SubVersion users around the world.

Tuesday, July 29, 2008

AJAX and Browser Caching Problem

For a long time, I have not been able to understand how to bypass the browser caching problem for developing AJAX applications. Internet Explorer simply looks at the URL, sees whether it has it in the CACHE, and brings up the cached version whenever possible.



The caching problem is observed for HTTP GET requests only. There is no caching issue for HTTP POST requests. It turns out that this is actually very easy to achieve.

A URL is different if it has any of the GET request keys are different. Hence to bypass caching, all one needs to do is add a parameter to the URL which has a new value everytime the URL is accessed, and is not really used by the client/server programs.

For more information see:
http://www.spacebug.com/solving_browser_caching_problem_of_ajax.html

http://www.howtoadvice.com/StopCaching

Friday, July 18, 2008

Running Python Scripts with Administrator Privileges on MAC OS X

Problem

I had a piece of software written in Python. I come primarily from Windows background where permissions etc. are quite hazy. 

On MAC OS X I wanted this software to be able to run with Administrator privileges. Apple has an Authentication API which enables an application to request for administrator privileges from the user whenever it needs it. Unfortunately I couldn't find out any way to access the authentication API directly from Python code.

Solution

AppleScript (MAC's built-in scripting language) has a very simple and straightfoward way to execute any script with admin privileges. 

Lets look at a simple example first:
do shell script ¬
"echo 'abc' > /Applications/MyTestFile" with administrator privileges


You can open Script Editor from /Applications/AppleScript/Script Editor.app and write the above example.

Interesting thing to note here is:
  • I am trying to do something which will not succeed with administrator privileges
  • The "with administrator privileges" clause ensures that AppleScript will ask you to grant administrator privileges to the shell script before execution
  • If you don't grant administrator privileges (may be you don't know or you forgot the password, or may be you don't want the shell script to run), the script will not be run.
  • If you grant the privileges, it will do as programmed above; i.e. write 'abc' to a file in /Applications.

Administrator privileges for Python programs

It must be easy for you to guess how to request for administrator privileges for running a Python program. Let me just put the code for clarity:
do shell script ¬
"/usr/bin/python myPythonProgram.py" with administrator privileges


Limitations
  • The solution requires you to request for privileges even before the python program started running. Thus if you wanted something where you could request the privileges only on need basis, this solution won't work. But at least something is better than nothing.