<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-38117766</id><updated>2012-01-15T14:32:11.593-08:00</updated><category term='eclipse'/><category term='django'/><title type='text'>Justin Hamade's Blog</title><subtitle type='html'>Helping other out with my experiences in Django, Python, VoIP, asterisk, Linux, and technology in general.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-38117766.post-7263259608546525291</id><published>2011-07-04T11:15:00.000-07:00</published><updated>2011-07-04T11:15:53.472-07:00</updated><title type='text'>Quicksynergy autostart Ubuntu</title><content type='html'>Starting quicksynergy in Ubuntu is actually really easy.  If you do a "ps aux" after you have quicksynergy configured and running you will see something like&lt;br /&gt;
&lt;pre&gt;/usr/bin/synergys -f --config .quicksynergy/synergy.conf
&lt;/pre&gt;&lt;br /&gt;
All you need to do is add this to your "Startup Applications"&lt;br /&gt;
System Settings -&gt; Startup Applications -&gt; Add &lt;br /&gt;
Name: Synergy&lt;br /&gt;
Command: /usr/bin/synergys -f --config .quicksynergy/synergy.conf&lt;br /&gt;
Add-&gt;Close-&gt;Log out and log back in.&lt;br /&gt;
&lt;br /&gt;
Done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7263259608546525291?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7263259608546525291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7263259608546525291' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7263259608546525291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7263259608546525291'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2011/07/quicksynergy-autostart-ubuntu.html' title='Quicksynergy autostart Ubuntu'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6167115557525639111</id><published>2011-03-16T13:31:00.000-07:00</published><updated>2011-03-16T13:31:24.227-07:00</updated><title type='text'>Screen VT100/ANSI Terminal Emulator Cheat Sheet - good coders code, great reuse</title><content type='html'>I love using screen I just wish I knew more of the shortcuts.  This cheat sheet has everything.
&lt;a href="http://www.catonmat.net/blog/screen-terminal-emulator-cheat-sheet/"&gt;Screen VT100/ANSI Terminal Emulator Cheat Sheet - good coders code, great reuse&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6167115557525639111?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.catonmat.net/blog/screen-terminal-emulator-cheat-sheet/' title='Screen VT100/ANSI Terminal Emulator Cheat Sheet - good coders code, great reuse'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6167115557525639111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6167115557525639111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6167115557525639111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6167115557525639111'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2011/03/screen-vt100ansi-terminal-emulator.html' title='Screen VT100/ANSI Terminal Emulator Cheat Sheet - good coders code, great reuse'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-5266424178554722727</id><published>2011-01-29T16:38:00.001-08:00</published><updated>2011-01-29T16:38:03.613-08:00</updated><title type='text'>Python Uniquify a List</title><content type='html'>Using sets it is actually pretty trivial to do&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:python"&gt;import sets
my_list = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]
unique_set = sets.Set(my_list)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-5266424178554722727?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/5266424178554722727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=5266424178554722727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5266424178554722727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5266424178554722727'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2011/01/python-uniquify-list.html' title='Python Uniquify a List'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6292999365387766885</id><published>2010-12-12T18:23:00.000-08:00</published><updated>2010-12-12T18:23:50.481-08:00</updated><title type='text'>What is DevOps and why is it important</title><content type='html'>With the recent &lt;a href="http://techcrunch.com/2010/12/08/breaking-salesforce-buys-heroku-for-212-million-in-cash/"&gt;purchase&lt;/a&gt; of &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt; by &lt;a href="http://www.salesforce.com/"&gt;salesforce&lt;/a&gt; made me think about the future of the "SysAdmin".&lt;br /&gt;
&lt;br /&gt;
As I was writing this I saw a recent &lt;a href="http://www.pkshiu.com/loft/archive/2010/12/jacob-kaplan-moss-on-devops"&gt;talk&lt;/a&gt; given by &lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; at  Django Boston Meetup titled DevOps.  &lt;br /&gt;
&lt;br /&gt;
The job of a SysAdmin is changing, frameworks like Django and Ruby on Rails along with services providers like Google Apps, Heroku, VMForce, and Djangy give developers everything they need.  The role of a SysAdmin is going to become very specialized, unless your talking about Windows systems ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6292999365387766885?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6292999365387766885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6292999365387766885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6292999365387766885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6292999365387766885'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/12/what-is-devops-and-why-is-it-important.html' title='What is DevOps and why is it important'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3083860768959034476</id><published>2010-11-25T19:19:00.000-08:00</published><updated>2010-11-26T13:55:04.321-08:00</updated><title type='text'>Gitorious install on Debian Squeeze with stompserver</title><content type='html'>I have modified this install tutorial from Christian Johansen found here &lt;a href="http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server"&gt;http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Some info from here as well &lt;a href="http://www.bluequartz.net/projects/ElectronicImaging/SCMService/html/index.html"&gt;http://www.bluequartz.net/projects/ElectronicImaging/SCMService/html/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
There is also source for a debian package by Marius Mårnes Mathiesen here &lt;a href="http://gitorious.org/gitorious-for-debian/gitorious"&gt;http://gitorious.org/gitorious-for-debian/gitorious&lt;/a&gt; the most recent commits are forked here &lt;a href="http://gitorious.org/~brodock/gitorious-for-debian/brodocks-gitorious"&gt;http://gitorious.org/~brodock/gitorious-for-debian/brodocks-gitorious&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Squeeze is needed for the new magickwand stuff&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Had issues with activemq so using stompserver instead&lt;/p&gt;&lt;br /&gt;
&lt;pre&gt;apt-get install -y sudo git-core git-svn apg build-essential libpcre3 libpcre3-dev sendmail \
make zlib1g zlib1g-dev ssh memcached apache2 \
libonig-dev libyaml-dev geoip-bin libgeoip-dev libgeoip1 \
uuid uuid-dev openjdk-6-jre apache2-prefork-dev curl openssl libcurl4-gnutls-dev

apt-get install -y imagemagick libmagickwand-dev &amp;amp;&amp;amp; \
gem install --no-ri --no-rdoc rmagick

apt-get install -y mysql-client mysql-server libmysqlclient15-dev &amp;amp;&amp;amp; \
gem install --no-ri --no-rdoc mysql

wget http://rubyforge.org/frs/download.php/71099/ruby-enterprise_1.8.7-2010.02_i386_ubuntu8.04.deb
sudo dpkg -i ruby-enterprise*

echo 'export PATH=/opt/ruby-enterprise/bin:$PATH
export LD_LIBRARY_PATH="/usr/local/lib"
export LDFLAGS="-L/usr/local/lib -Wl,-rpath,/usr/local/lib"' &amp;gt;&amp;gt; /etc/profile

echo '/usr/local/lib
include ld.so.conf.d/*.conf' &amp;gt;&amp;gt; /etc/ld.so.conf

ldconfig

cd /usr/src
wget http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz
tar xvzf rubygems*
cd rubygems*
ruby setup.rb

cd /usr/src
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
tar xvfz sphinx-*
cd sphinx-*
./configure
make &amp;amp;&amp;amp; sudo make install
gem install --no-ri --no-rdoc ultrasphinx

gem install stompserver
echo '#!/bin/sh
# Start/stop the stompserver
# WATCH THE LINE WRAPPING BELOW
### BEGIN INIT INFO
# Provides: stomp
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Stomp
# Description: Stomp
### END INIT INFO
$DAEMON=/usr/local/bin/stompserver
test -f $DAEMON || exit 0
. /lib/lsb/init-functions
case $1 in
start) log_daemon_msg Starting stompserver stompserver
     start-stop-daemon --start --name stompserver --startas $DAEMON \
                                      --background --user git
     log_end_msg $?
    ;;
stop) log_daemon_msg Stopping stompserver stompserver
     start-stop-daemon --stop --name stompserver
     log_end_msg $?
     ;;
restart) log_daemon_msg Restarting stompserver stompserver
    start-stop-daemon --stop --retry 5 --name stompserver
    start-stop-daemon --start --name stompserver --startas $DAEMON \
                                       --background --user git
    log_end_msg $?
    ;;
status)
    status_of_proc $DAEMON stompserver &amp;&amp; exit 0 || exit $?
    ;;
*) log_action_msg Usage: /etc/init.d/stomp {start|stop|restart|status}
    exit 2
    ;;
esac
exit 0' &gt; /etc/init.d/stompserver
chmod +x /etc/init.d/stompserver
update-rc.d stompserver defaults

echo '#!/bin/sh
# Start/stop the git poller
#
### BEGIN INIT INFO
# Provides: git-poller
# Required-Start: stomp
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Gitorious poller
# Description: Gitorious poller
### END INIT INFO

GITORIOUS_ROOT=/var/www/gitorious
echo  `date` " Starting git-poller" &gt;&gt; "$GITORIOUS_ROOT/log/git-poller.log"
/bin/su -- git -c " cd $GITORIOUS_ROOT; RAILS_ENV=production script/poller $@"' &gt; /etc/init.d/poller
chmod +x /etc/init.d/poller
update-rc.d poller defaults


git clone git://gitorious.org/gitorious/mainline.git gitorious
chmod -R g+sw /var/www/gitorious
ln -s /var/www/gitorious/script/gitorious /usr/local/bin/gitorious
cd gitorious/
rm public/.htaccess
mkdir -p tmp/pids
chmod ug+x script/*
chmod -R g+w config/ log/ public/ tmp/

which ruby
vi doc/templates/ubuntu/git-daemon
&lt;/pre&gt;Gitorious ships with ready to use git-ultrasphinx and git-daemon scripts. Be aware that the git-daemon script has hardcoded paths to both Ruby Enterprise Edition and Gitorious. Pop open git-daemon and set correct paths to the Ruby you want to use (stick with REE if you installed it earlier) and your Gitorious installation. These are the lines you need to see (lines 16 and 18 at the time of writing):&lt;br /&gt;
&lt;pre&gt;GIT_DAEMON="/opt/ruby-enterprise/bin/ruby \
    /var/www/gitorious/script/git-daemon -d"
&lt;/pre&gt;&lt;pre&gt;ln -s /var/www/gitorious/doc/templates/ubuntu/git-ultrasphinx /etc/init.d/.
ln -s /var/www/gitorious/doc/templates/ubuntu/git-daemon /etc/init.d/.

chmod +x /etc/init.d/git-ultrasphinx
chmod +x /etc/init.d/git-daemon
update-rc.d -f git-daemon start 99 2 3 4 5 .
update-rc.d -f git-ultrasphinx start 99 2 3 4 5 .

gem install --no-ri --no-rdoc rails mongrel mime-types textpow chronic \
    ruby-hmac daemons mime-types oniguruma textpow chronic BlueCloth \
    ruby-yadis ruby-openid geoip rspec rspec-rails RedCloth echoe
gem install --no-ri --no-rdoc --version="1.0.1" rack

adduser git
usermod -a -G gitorious git
mkdir /var/git
mkdir /var/git/repositories
mkdir /var/git/tarballs
mkdir /var/git/tarball-work
chown -R git:git /var/git

su git
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
vi ~/.bashrc
&lt;/pre&gt;Append the following to /home/git/.bashrc &lt;br /&gt;
&lt;pre&gt;# User specific aliases and functions
export RUBY_HOME=/opt/ruby-enterprise
export GEM_HOME=$RUBY_HOME/lib/ruby/gems/1.8/gems
export PATH=$RUBY_HOME/bin:$PATH
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;exit
cd /var/www/gitorious
cp config/database.sample.yml config/database.yml
cp config/gitorious.sample.yml config/gitorious.yml
cp config/broker.yml.example config/broker.yml
apg -m 64
config/gitorious.yml
&lt;/pre&gt;See original doc for details on this config file&lt;br /&gt;
&lt;pre&gt;rake db:migrate RAILS_ENV=production
mysql -uroot -p
create database gitorious;
create database gitorious_test;
create database gitorious_dev;
grant all privileges on gitorious.* to YOURUSER@localhost \
    identified by 'YOURPASSWORD';
grant all privileges on gitorious_test.* to YOURUSER@localhost;
grant all privileges on gitorious_dev.* to YOURUSER@localhost;
sudo rake gems:install
vi config/database.yml
&lt;/pre&gt;Make your config match your mysql db setup&lt;br /&gt;
&lt;pre&gt;rake db:migrate RAILS_ENV=production
cd /var/www/gitorious
env RAILS_ENV=production ruby script/create_admin
script/console
&amp;gt; user = User.first
&amp;gt; user.login = "yourname" # Change to your desired username
&amp;gt; user.activate
&amp;gt; user.accept_terms
&amp;gt; user.save
rake ultrasphinx:bootstrap RAILS_ENV=production
chown -R git:gitorious config/environment.rb script/poller log tmp
chmod -R g+w config/environment.rb script/poller log tmp
chmod ug+x script/poller
/etc/init.d/activemq start
env RAILS_ENV=production /etc/init.d/git-daemon start
su git -c \
  "cd /var/www/gitorious &amp;amp;&amp;amp; \
    env RAILS_ENV=production script/poller run"

su git -c \
  "cd /var/www/gitorious &amp;amp;&amp;amp; script/server -e production"

echo '* */1 * * * root cd /var/www/gitorious &amp;amp;&amp;amp; rake ultrasphinx:index RAILS_ENV=production' &amp;gt;&amp;gt; /etc/crontab
cp doc/templates/ubuntu/gitorious-logrotate /etc/logrotate.d/gitorious
sudo chmod +x /etc/logrotate.d/gitorious
gem install passenger
passenger-install-apache2-module

a2enmod rewrite
a2enmod deflate
a2enmod passenger
a2enmod expires
a2enmod rewrite

vi conf/vhost.conf
&lt;/pre&gt;Update config&lt;br /&gt;
&lt;pre&gt;ln -s /var/www/gitorious/conf/vhost.conf /etc/apache2/sites-available/gitorious
a2ensite gitorious

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3083860768959034476?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3083860768959034476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3083860768959034476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3083860768959034476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3083860768959034476'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/11/gitorious-install-on-debian-squeeze.html' title='Gitorious install on Debian Squeeze with stompserver'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4526015535094762855</id><published>2010-08-11T13:59:00.000-07:00</published><updated>2010-08-11T13:59:11.808-07:00</updated><title type='text'>Nagios3 on Debian external commands</title><content type='html'>Enabling external commands in nagios on a Debian deb install of nagios is a bit of a pain.&lt;br /&gt;
&lt;br /&gt;
First in /etc/nagios3/nagios.cfg change&lt;br /&gt;
&lt;pre&gt;check_external_commands=1
&lt;/pre&gt;&lt;br /&gt;
Then you will get errors about &lt;br /&gt;
&lt;pre&gt;Error: Could not stat() command file '/var/lib/nagios3/rw/nagios.cmd'!
&lt;/pre&gt;&lt;br /&gt;
If you &lt;br /&gt;
&lt;pre&gt;rm /var/lib/nagios3/rw/nagios.cmd
chmod a+x /var/lib/nagios3
chmod g+s /var/lib/nagios3/rw
/etc/init.d/nagios restart
&lt;/pre&gt;&lt;br /&gt;
That error should go away and www-data should have read access to that file.  You may need to&lt;br /&gt;
&lt;pre&gt;chgrp www-data /var/lib/nagios3/rw
&lt;/pre&gt;But that was already there for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4526015535094762855?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4526015535094762855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4526015535094762855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4526015535094762855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4526015535094762855'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/08/nagios3-on-debian-external-commands.html' title='Nagios3 on Debian external commands'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1961136213074688072</id><published>2010-07-21T08:46:00.000-07:00</published><updated>2010-07-21T08:46:37.937-07:00</updated><title type='text'>Django by Example: Django Tutorials - Django by Example</title><content type='html'>&lt;a href="http://lightbird.net/dbe/index.html"&gt;Django by Example: Django Tutorials - Django by Example&lt;/a&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;A great list of Django tutorials.  I have also started reading&lt;a href="http://apress.com/book/view/9781590599815"&gt; Foundation of Agile Python Development by Jeff Younker&lt;/a&gt; and will have a book review as soon as I am done.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1961136213074688072?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://lightbird.net/dbe/index.html' title='Django by Example: Django Tutorials - Django by Example'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1961136213074688072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1961136213074688072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1961136213074688072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1961136213074688072'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/07/django-by-example-django-tutorials.html' title='Django by Example: Django Tutorials - Django by Example'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4327362671788822553</id><published>2010-07-18T23:07:00.000-07:00</published><updated>2010-07-19T18:13:43.727-07:00</updated><title type='text'>Aastra disappoints again</title><content type='html'>I have been doing VoIP work with &lt;a href="http://asterisk.org/"&gt;Asterisk&lt;/a&gt; since pre 1.0 days, which is about 6-7 years.  The very first phones we choose were the &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt;/&lt;a href="http://www.sayson.com/"&gt;Sayason&lt;/a&gt; &lt;a href="http://www.voip-info.org/wiki/view/Aastra+480i"&gt;480i&lt;/a&gt; which were very feature rich and pretty good hardware.  The software quality is what seemed to be  lacking, it was a while ago so I can't remember specific examples.  We decided, back at that time, to switch to &lt;a href="http://www.voip-info.org/wiki/view/Polycom+SoundPoint+IP+501"&gt;Polycom 501s&lt;/a&gt;.  The &lt;a href="http://www.voip-info.org/wiki/view/Polycom+SoundPoint+IP+501"&gt;501s&lt;/a&gt; were not much more in price, had the same features, maybe even more at that time, and just felt like a much better product.&lt;br /&gt;
&lt;br /&gt;
After a few years &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt; came out with the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/SID-3D8CCB6A-B5DC9FA1/03/hs.xsl/21552.htm"&gt;57i&lt;/a&gt;.  The popular &lt;a href="http://nerdvittles.com/"&gt;Nerd Vittles Blog&lt;/a&gt; run by &lt;a href="http://bestof.nerdvittles.com/about/"&gt;Ward Mundy&lt;/a&gt; called this phone the best asterisk phone back in 2008 &lt;a href="http://nerdvittles.com/?p=207"&gt;http://nerdvittles.com/?p=207&lt;/a&gt;.  I was still hesitant to use it due to my poor experience that I had with Aastra phones previously.&lt;br /&gt;
&lt;br /&gt;
We decided to try them again about 6 months ago, and with the new &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/SID-3D8CCB6A-A089DFF6/03/hs.xsl/18301.htm"&gt;XML scripts that Aastra&lt;/a&gt; has made for &lt;a href="http://fonality.com/trixbox/"&gt;Trixbox&lt;/a&gt;/&lt;a href="http://elastix.org/"&gt;Elastix&lt;/a&gt;/&lt;a href="http://pbxinaflash.net/"&gt;PIF&lt;/a&gt; these phones work great with Asterisk and I have not had one issue with the phones firmware.&lt;br /&gt;
&lt;br /&gt;
Now due to my renewed faith in &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt; we decided to try the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/27281.htm"&gt;Aastralink Pro 160&lt;/a&gt; bundle, which comes with a few phones.  Our customer also needed wireless as well so we thought we would try the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/30382.htm"&gt;MBU400&lt;/a&gt; which the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/27281.htm"&gt;ALP 160&lt;/a&gt; fully supports.  This is where the fun started.&lt;br /&gt;
&lt;br /&gt;
First the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/27281.htm"&gt;Aastralink Pro 160&lt;/a&gt;.  It has decent hardware, 2 &lt;a href="http://www.voip-info.org/wiki/view/FXS"&gt;FXS&lt;/a&gt; ports and 6 &lt;a href="http://www.voip-info.org/wiki/view/FXO"&gt;FXO&lt;/a&gt; ports, and it a pretty reasonable price compared to building your own system with &lt;a href="http://sangoma.com/products/hardware_products/analog_telephony/a200.html"&gt;Sangoma&lt;/a&gt; or &lt;a href="http://www.digium.com/en/products/analog/"&gt;Digium&lt;/a&gt; PCI cards.  For the software that is a different story.&amp;nbsp; As an Asterisk hacker I have been spoiled by flexibility.  Even with &lt;a href="http://elastix.org/"&gt;Elastix&lt;/a&gt; (my choice of &lt;a href="http://www.freepbx.org/"&gt;FreePBX&lt;/a&gt; distro) I can always throw something in extensions_custom.conf and change the dial plan to suite any customer's needs.  Now I knew the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/27281.htm"&gt;ALP 160&lt;/a&gt; didn't give me root access so I figured the basic stuff would be supported by the web based GUI, I guessed wrong.  &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;You are forced to dial 9 (PSTN) or 8 (SIP) to dial out, you can't change this and my customers hate dialing prefixes&lt;/li&gt;
&lt;li&gt;Not only do you have to dial a 8 prefix for SIP but if you have multiple SIP trunks you have to dial another prefix for the trunk number, ie 80 or 81 or 82&lt;/li&gt;
&lt;li&gt;Inbound SIP calls all go to the same place, you cannot control calls based on SIP trunk or DID, you can control where the calls from the FXO ports go.&lt;/li&gt;
&lt;li&gt;Each extension must have a &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt; hardware phone and must be online.  You can have any SIP device as a mirrored extension but if the phone that it's mirrored to goes offline so does it.&lt;/li&gt;
&lt;li&gt;I am guessing that timing is not sync'd between the FXO and FXS because I could not get faxing to work for the life of me.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
So what other options are there for a small PBX? &lt;a href="http://xorcom.com/"&gt; Xorcom&lt;/a&gt; makes one that is decent, this is what we switched our customer to.  Building your own out of a Atom based barebones kit is a good option too.  Or Ward calls his choice the Orgasmatron &lt;a href="http://nerdvittles.com/?tag=orgasmatron"&gt;http://nerdvittles.com/?tag=orgasmatron&lt;/a&gt; but they don't have any FXS or FXO.&lt;br /&gt;
&lt;br /&gt;
Second the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/30382.htm"&gt;MBU 400.&lt;/a&gt;  Now this is a nice looking unit.  It actually is identical hardware to the SNOM m3.  It integrates pretty easy with the &lt;a href="http://www.aastratelecom.com/cps/rde/xchg/03/hs.xsl/27281.htm"&gt;Aastralink Pro 160&lt;/a&gt; (except it can't be a mirrored extension it has to be its own extension).  But for some reason the unit we had would not connect back to the access point after being out of range, unless there was some sort of manual intervention.  So I spent hours going back and forth with &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt; tech support.  Now you figure people calling reseller tech support would be fairly technical, so the support people should be just as technical or even more.  This is not the case for &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt;.  The most common response I get from them for a few different issues that I had called about was "I don't know."  If it is a tough problem that is fine, but at least offer a next step or some sort of escalation.&lt;br /&gt;
&lt;br /&gt;
So what did we do?  We switched to Polycom, again.  This time to the &lt;a href="http://www.polycom.com/products/voice/wireless_solutions/dect_communications/handsets/dect_5040_handset.html"&gt;Polycom Kirk 5040&lt;/a&gt; handsets with the &lt;a href="http://www.polycom.com/products/voice/wireless_solutions/dect_communications/infrastructure/dect_ws_600v3.html"&gt;600 access point&lt;/a&gt;, and a couple &lt;a href="http://www.polycom.com/products/voice/wireless_solutions/dect_communications/infrastructure/dect_repeaters.html"&gt;repeaters&lt;/a&gt;.  These were a bit tough to dig through the manual and figure out how to get it setup, I did need help from our distributor on setting up the repeaters, but other than that these things have been rock solid for our customer.&lt;br /&gt;
&lt;br /&gt;
The point of me writing this, other than to bash on &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt;, is to plead for them to stop trying to be a software company.  I have heard of and experienced many show stopping issues in their firmware.&amp;nbsp; Every time I upgrade an &lt;a href="http://www.aastratelecom.com/"&gt;Aastra&lt;/a&gt; device I am not sure what I am going to get.  It has been like this since the 480i days 7 years ago.  I don't know what their development and testing process is, but I doubt that it is good.  On the flip side, the hardware they make seems to be great, the problem is it takes them years to release firmware for it that is as good as the hardware is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4327362671788822553?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4327362671788822553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4327362671788822553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4327362671788822553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4327362671788822553'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/07/aastra-disappoints-again.html' title='Aastra disappoints again'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4971048026035715273</id><published>2010-07-15T09:51:00.000-07:00</published><updated>2010-07-15T09:51:56.555-07:00</updated><title type='text'>Rails on Debian</title><content type='html'>Ran into a strange issue while debugging a Rails app that I am working on.  I finally found the exact problem and issue here http://wiki.github.com/radiant/radiant/undefined-method-for-enumerable&lt;br /&gt;
&lt;br /&gt;
Turns out that &lt;blockquote&gt;the error comes from an incompatibility between Ruby 1.8.7 and Rails 2.0.2. Ruby 1.8.7 has String#chars and returns an Enumerator object, but Rails 2.0.2 expects an ActiveSupport::Multibyte::Chars  object.&lt;/blockquote&gt;Which is pointed out here http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg528878.html&lt;br /&gt;
&lt;br /&gt;
Putting this in your environment.rb fixes the issue&lt;br /&gt;
&lt;pre&gt;unless '1.9'.respond_to?(:force_encoding)
  String.class_eval do
    begin
      remove_method :chars
    rescue NameError
      # OK
    end
  end
end
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4971048026035715273?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4971048026035715273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4971048026035715273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4971048026035715273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4971048026035715273'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/07/rails-on-debian.html' title='Rails on Debian'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2219224764133447415</id><published>2010-07-14T11:49:00.000-07:00</published><updated>2010-12-10T11:51:29.212-08:00</updated><title type='text'>Fixing Python indentations in VIM</title><content type='html'>Had this problem today where I created a file with eclipse then edited it with vim and that made the tabs inconsistent.  Found this post on stackoverflow that had a couple of suggestions&lt;br /&gt;
&lt;br /&gt;
http://stackoverflow.com/questions/1024435/howto-fix-python-indentation&lt;br /&gt;
&lt;br /&gt;
1. Use reindent.py - this requires apt-get install python-examples on debian/ubuntu&lt;br /&gt;
2. :%s/\t/    /g - this is what I used and it worked great&lt;br /&gt;
&lt;br /&gt;
Other vim tricks I have used lately:&lt;br /&gt;
- Remove empty lines :%s/^[\ \t]*\n//g &lt;br /&gt;
- Re-indent entire file gg=G&lt;br /&gt;
- Remove lines with comments g/^#/d&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2219224764133447415?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2219224764133447415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2219224764133447415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2219224764133447415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2219224764133447415'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/07/fixing-python-indentations-in-vim.html' title='Fixing Python indentations in VIM'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2441979827528165219</id><published>2010-06-01T20:35:00.000-07:00</published><updated>2010-06-01T20:35:50.985-07:00</updated><title type='text'>Modular Django Admin Part 3</title><content type='html'>Django Auth has a lot of stuff built in &lt;a href="http://docs.djangoproject.com/en/dev/topics/auth/"&gt;http://docs.djangoproject.com/en/dev/topics/auth/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A list of all the default templates and urls you need for login password reset and password change.  Most of these templates are in django/contrib/admin/templates/registration&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:python"&gt;url(r'^accounts/login/$', 'django.contrib.auth.views.login',name='login'),
url(r'^accounts/$', 'django.contrib.auth.views.login',name='login'),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout',{'next_page': '/'},name='logout'),
url(r'^accounts/password_change/$', 'django.contrib.auth.views.password_change',name='password_change'),
url(r'^accounts/password_change_done/$', 'django.contrib.auth.views.password_change_done',name='password_change_done'),
url(r'^accounts/password_reset/$', 'django.contrib.auth.views.password_reset',name='password_reset'),
url(r'^accounts/accounts/password_reset/done/$', 'django.contrib.auth.views.password_reset_done',name='password_reset_done'),
url(r'^accounts/reset/(?P&lt;uidb36&gt;[0-9A-Za-z]+)-(?P&lt;token&gt;.+)/$', 'django.contrib.auth.views.password_reset_confirm',name='password_reset_confirm'),
url(r'^accounts/reset/done/$', 'django.contrib.auth.views.password_reset_complete',name='password_reset_complete'),
&lt;/pre&gt;&lt;br /&gt;
template/registration/login.html (django/contrib/admin/templates/admin/login.html)&lt;br /&gt;
template/registration/logged_out.html&lt;br /&gt;
template/registration/password_change_form.html&lt;br /&gt;
template/registration/password_change_done.html&lt;br /&gt;
template/registration/password_reset_email.html&lt;br /&gt;
template/registration/password_reset_done.html&lt;br /&gt;
template/registration/password_reset_confirm.html&lt;br /&gt;
template/registration/password_reset_complete.html&lt;br /&gt;
&lt;br /&gt;
So now we can login see generic view lists of our models, not we need to edit them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2441979827528165219?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2441979827528165219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2441979827528165219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2441979827528165219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2441979827528165219'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/06/modular-django-admin-part-3.html' title='Modular Django Admin Part 3'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-8959875381350190773</id><published>2010-05-16T12:01:00.000-07:00</published><updated>2010-06-01T20:37:24.781-07:00</updated><title type='text'>Django Modular Admin Part 2</title><content type='html'>I just realized that alot of the functionality that the admin login has is not part of django.contrib.auth but is only in the admin.&lt;br /&gt;
&lt;br /&gt;
A couple of things I have figure out as a result with form validation errors in the template.&lt;br /&gt;
{{ form.non_field_errors }} is for a ValidationError that is for the whole form.&lt;br /&gt;
&lt;br /&gt;
A snippet of my login.html template&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:python"&gt;&amp;lt;div id=&amp;quot;welcome_login&amp;quot; title=&amp;quot;Welcome To My Site&amp;quot;&amp;gt; 
  &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Admin Login&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;form action=&amp;quot;.&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;forms&amp;quot; name=&amp;quot;form&amp;quot; &amp;gt;{% csrf_token %}
   {% if form.non_field_errors %}
   &amp;lt;div class=&amp;quot;response-msg error ui-corner-all&amp;quot;&amp;gt;
    &amp;lt;span&amp;gt;Error message&amp;lt;/span&amp;gt;
    {{ form.non_field_errors }}
   &amp;lt;/div&amp;gt;
   {% endif %}
     &amp;lt;ul&amp;gt; 
    &amp;lt;li&amp;gt; 
     &amp;lt;label for=&amp;quot;id_username&amp;quot; class=&amp;quot;desc&amp;quot;&amp;gt;{% trans &amp;#39;Username:&amp;#39; %}&amp;lt;/label&amp;gt; 
     &amp;lt;div&amp;gt;
      {% if form.username.errors %}
      &amp;lt;div class=&amp;quot;response-msg error ui-corner-all&amp;quot;&amp;gt;
       &amp;lt;span&amp;gt;Error message&amp;lt;/span&amp;gt;
       {{ form.username.errors }}
      &amp;lt;/div&amp;gt;
      {% endif %}
      &amp;lt;input type=&amp;quot;text&amp;quot; tabindex=&amp;quot;1&amp;quot; maxlength=&amp;quot;255&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;field text full&amp;quot; name=&amp;quot;username&amp;quot; id=&amp;quot;email&amp;quot; /&amp;gt;

     &amp;lt;/div&amp;gt; 
    &amp;lt;/li&amp;gt; 
    &amp;lt;li&amp;gt; 
     &amp;lt;label for=&amp;quot;id_password&amp;quot; class=&amp;quot;desc&amp;quot;&amp;gt;{% trans &amp;#39;Password:&amp;#39; %}&amp;lt;/label&amp;gt;
     &amp;lt;div&amp;gt; 
      {% if form.password.errors %}
      &amp;lt;div class=&amp;quot;response-msg error ui-corner-all&amp;quot;&amp;gt;
       &amp;lt;span&amp;gt;Error message&amp;lt;/span&amp;gt;
       {{ form.password.errors }}
      &amp;lt;/div&amp;gt;
      {% endif %}
      &amp;lt;input type=&amp;quot;password&amp;quot; tabindex=&amp;quot;1&amp;quot; maxlength=&amp;quot;255&amp;quot; value=&amp;quot;&amp;quot; class=&amp;quot;field text full&amp;quot; name=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; /&amp;gt;
      &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;this_is_the_login_form&amp;quot; value=&amp;quot;1&amp;quot; /&amp;gt;
     &amp;lt;/div&amp;gt; 
    &amp;lt;/li&amp;gt; 
   &amp;lt;/ul&amp;gt; 
  &amp;lt;/form&amp;gt; 
 &amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
More to come on django auth&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-8959875381350190773?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/8959875381350190773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=8959875381350190773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8959875381350190773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8959875381350190773'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/05/django-modular-admin-part-2.html' title='Django Modular Admin Part 2'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6131835835055993529</id><published>2010-05-13T21:12:00.000-07:00</published><updated>2010-06-01T20:24:05.414-07:00</updated><title type='text'>Modular Django Admin Part 1</title><content type='html'>The django admin is awesome, we all know that, but there is always the debate to role your own or to customize the admin.  Make the admin more modular would be ideal and that is what we will be trying to do.&lt;br /&gt;
&lt;br /&gt;
In part one we will just start with the basics and setup a tabular list using the object_list generic view with gives you pagination for free.  &lt;br /&gt;
&lt;br /&gt;
One trick to get the key/value pairs into the template of the model is using a function to return self.__dict__.iteritems()&lt;br /&gt;
&lt;br /&gt;
The Model (myapp/models.py)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python;"&gt;class MyObject(models.Model):
    name = models.CharField(max_length=75)
    slug = models.SlugField(unique=True)
    
    def __unicode__(self):
        return self.name

    def attrs(self):
        for attr, value in self.__dict__.iteritems():
            yield attr, value
&lt;/pre&gt;&lt;br /&gt;
The View (myapp/views.py)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python;"&gt;from django.views.generic.list_detail import object_list
def applicant_list_jobs(request):
    return object_list(request, queryset=Job.objects.all(), paginate_by=5)
&lt;/pre&gt;&lt;br /&gt;
The Template (templates/myapp/myobject_list.html)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python;"&gt;{% extends "admin/change_list.html" %}
{% block content %}
 &amp;lt;table&amp;gt;
  {% for object in object_list %}
  
  &amp;lt;tr class="{% cycle 'row1' 'row2' %}"&amp;gt;
   {% for key,value in object.attrs %}
   &amp;lt;td&amp;gt;{{ value }}&amp;lt;/td&amp;gt;
   {% endfor %}
  &amp;lt;/tr&amp;gt;
  {% endfor %}
 &amp;lt;/table&amp;gt;
 &amp;lt;p class="paginator"&amp;gt;
 {% if page_obj.has_previous %}
  &amp;lt;a href="?page={{ page_obj.previous_page_number }}"&amp;gt;&amp;lt;&amp;lt;/a&amp;gt;
 {% endif %}
  Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
 {% if page_obj.has_next %}
  &amp;lt;a href="?page={{ page_obj.next_page_number }}"&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;
 {% endif %}
&amp;lt;/p&amp;gt;
{% endblock content %}
&lt;/pre&gt;&lt;br /&gt;
Next up will be where the templates and urls go for login and the built in authentication tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6131835835055993529?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6131835835055993529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6131835835055993529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6131835835055993529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6131835835055993529'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/05/modular-django-admin-part-1.html' title='Modular Django Admin Part 1'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1096562838750057734</id><published>2010-03-31T23:39:00.000-07:00</published><updated>2010-03-31T23:39:34.175-07:00</updated><title type='text'>Revisited: Asterisk and FreePBX under Ubuntu 9.10 and Lighttpd on a Linode VPS</title><content type='html'>&lt;a href="http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode"&gt;Revisited: Asterisk and FreePBX under Ubuntu 9.10 and Lighttpd on a Linode VPS&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1096562838750057734?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode' title='Revisited: Asterisk and FreePBX under Ubuntu 9.10 and Lighttpd on a Linode VPS'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1096562838750057734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1096562838750057734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1096562838750057734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1096562838750057734'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/03/revisited-asterisk-and-freepbx-under.html' title='Revisited: Asterisk and FreePBX under Ubuntu 9.10 and Lighttpd on a Linode VPS'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2790993526439948914</id><published>2010-03-31T22:10:00.000-07:00</published><updated>2010-03-31T22:10:06.848-07:00</updated><title type='text'>Re: [Asterisk-Users] how to keep Asterisk up to date on many servers</title><content type='html'>&lt;a href="http://www.mail-archive.com/asterisk-users@lists.digium.com/msg83301.html"&gt;Re: [Asterisk-Users] how to keep Asterisk up to date on many servers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2790993526439948914?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.mail-archive.com/asterisk-users@lists.digium.com/msg83301.html' title='Re: [Asterisk-Users] how to keep Asterisk up to date on many servers'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2790993526439948914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2790993526439948914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2790993526439948914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2790993526439948914'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/03/re-asterisk-users-how-to-keep-asterisk.html' title='Re: [Asterisk-Users] how to keep Asterisk up to date on many servers'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-8806403604569177686</id><published>2010-03-31T19:46:00.000-07:00</published><updated>2010-03-31T19:46:31.062-07:00</updated><title type='text'>A fax server with IAXmodem and Hylafax</title><content type='html'>&lt;a href="http://www.the-asterisk-book.com/unstable/faxserver-mit-iaxmodem-und-hylafax.html"&gt;A fax server with IAXmodem and Hylafax&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-8806403604569177686?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.the-asterisk-book.com/unstable/faxserver-mit-iaxmodem-und-hylafax.html' title='A fax server with IAXmodem and Hylafax'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/8806403604569177686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=8806403604569177686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8806403604569177686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8806403604569177686'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/03/fax-server-with-iaxmodem-and-hylafax.html' title='A fax server with IAXmodem and Hylafax'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2639832049329530927</id><published>2010-03-20T00:22:00.000-07:00</published><updated>2010-03-20T00:22:16.442-07:00</updated><title type='text'>Martin W Smith � Blog Archive � SVN Checksum Problem</title><content type='html'>&lt;a href="http://blog.martinwsmith.co.uk/2009/11/svn-checksum-problem/"&gt;Martin W Smith � Blog Archive � SVN Checksum Problem&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2639832049329530927?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.martinwsmith.co.uk/2009/11/svn-checksum-problem/' title='Martin W Smith � Blog Archive � SVN Checksum Problem'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2639832049329530927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2639832049329530927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2639832049329530927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2639832049329530927'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/03/martin-w-smith-blog-archive-svn.html' title='Martin W Smith � Blog Archive � SVN Checksum Problem'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1058143744829806979</id><published>2010-03-13T21:37:00.000-08:00</published><updated>2010-03-23T10:36:08.049-07:00</updated><title type='text'>Django Model Values as Dict</title><content type='html'>This is pretty easy to do but I always forget&lt;br /&gt;
&lt;pre&gt;obj_dict = MyModel.Objects.filter(id__gt=0).values()
&lt;/pre&gt;And you can also add MyModel.objects.filter(id__gt=0).values_list('COLUMN',flat=True)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1058143744829806979?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1058143744829806979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1058143744829806979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1058143744829806979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1058143744829806979'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/03/django-model-values-as-dict.html' title='Django Model Values as Dict'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2320896330894028526</id><published>2010-02-26T00:35:00.000-08:00</published><updated>2010-02-26T00:35:14.470-08:00</updated><title type='text'>Hylafax 6.0   Debian Lenny T38modem 1.2.0   Asterisk 1.6</title><content type='html'>After fighting with t38modem for a week I finally found versions of opal and ptlib that work with t38modem 1.2 for sending faxes (have not tested receiving yet).

ptlib-2.6.6
opal-3.6.7
t38modem-1.2.0

I am using most of the other instructions from this how to below.


&lt;a href="http://www.foriamroot.org/hylafax-6-0-debian-or-ubuntu-t38modem-1-0-asterisk-1-6/"&gt;Hylafax 6.0   Debian (or Ubuntu)   T38modem 1.0   Asterisk 1.6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2320896330894028526?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foriamroot.org/hylafax-6-0-debian-or-ubuntu-t38modem-1-0-asterisk-1-6/' title='Hylafax 6.0   Debian Lenny T38modem 1.2.0   Asterisk 1.6'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2320896330894028526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2320896330894028526' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2320896330894028526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2320896330894028526'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/02/hylafax-60-debian-lenny-t38modem-120.html' title='Hylafax 6.0   Debian Lenny T38modem 1.2.0   Asterisk 1.6'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3288172984288497126</id><published>2010-02-25T19:33:00.000-08:00</published><updated>2010-02-25T19:33:54.472-08:00</updated><title type='text'>Debian Backports copy paste</title><content type='html'>&lt;pre&gt;
echo 'deb http://www.backports.org/debian lenny-backports main contrib non-free' &gt;&gt; /etc/apt/sources.list
apt-get update &amp;&amp; apt-get install debian-backports-keyring --force-yes &amp;&amp; apt-get update
&lt;/pre&gt;


&lt;a href="http://backports.org/dokuwiki/doku.php?id=instructions"&gt;instructions [Debian Backports]&lt;/a&gt;: "deb http://www.backports.org/debian lenny-backports main contrib non-free"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3288172984288497126?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://backports.org/dokuwiki/doku.php?id=instructions' title='Debian Backports copy paste'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3288172984288497126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3288172984288497126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3288172984288497126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3288172984288497126'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/02/debian-backports-copy-paste.html' title='Debian Backports copy paste'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4549463739156170098</id><published>2010-02-15T15:16:00.000-08:00</published><updated>2010-02-15T15:16:59.296-08:00</updated><title type='text'>Django | User authentication in Django | Django documentation</title><content type='html'>Django auth doesn't have all the urls listed anywhere so here they are:
&lt;pre style="brush:python"&gt;
    (r'^accounts/login/$', 'django.contrib.auth.views.login'),
    (r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
    (r'^accounts/password_change/$', 'django.contrib.auth.views.password_change'),
    (r'^accounts/password_change_done/$', 'django.contrib.auth.views.password_change_done'),
    (r'^accounts/password_reset/$', 'django.contrib.auth.views.password_reset'),
    (r'^accounts/accounts/password_reset/done/$', 'django.contrib.auth.views.password_reset_done'),
    (r'^accounts/reset/(?P&lt;uidb36&gt;[0-9A-Za-z]+)-(?P&lt;token&gt;.+)/$', 'django.contrib.auth.views.password_reset_confirm'),
    (r'^accounts/reset/done/$', 'django.contrib.auth.views.password_reset_complete'),  
&lt;/pre&gt;

&lt;a href="http://docs.djangoproject.com/en/dev/topics/auth/"&gt;Django | User authentication in Django | Django documentation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4549463739156170098?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://docs.djangoproject.com/en/dev/topics/auth/' title='Django | User authentication in Django | Django documentation'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4549463739156170098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4549463739156170098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4549463739156170098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4549463739156170098'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/02/django-user-authentication-in-django.html' title='Django | User authentication in Django | Django documentation'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-8381818979268132354</id><published>2010-01-29T15:22:00.000-08:00</published><updated>2010-01-29T15:25:00.433-08:00</updated><title type='text'>Django | Generic views | Django documentation</title><content type='html'>Took me forever to figure this out with generi views, but the I just don't read well. Here is an example template: &lt;pre&gt;&amp;lt;p class=\&amp;quot;paginator\&amp;quot;&amp;gt;
 &amp;lt;span class=\&amp;quot;step-links\&amp;quot;&amp;gt;
  {% if page_obj.has_previous %}
   &amp;lt;a href=\&amp;quot;?page={{ page_obj.previous_page_number }}\&amp;quot;&amp;gt;&amp;lt;&amp;lt;/a&amp;gt;
  {% endif %}

  &amp;lt;span class=\&amp;quot;current\&amp;quot;&amp;gt;
   Page &amp;lt;span class=\&amp;quot;this-page\&amp;quot;&amp;gt;{{ page }}&amp;lt;/span&amp;gt; of {{ paginator.num_pages }}
  &amp;lt;/span&amp;gt;

  {% if page_obj.has_next %}
   &amp;lt;a href=\&amp;quot;?page={{ page_obj.next_page_number }}\&amp;quot;&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;
  {% endif %}
 &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&lt;/p&gt;&lt;/pre&gt;"If the results are paginated, the context will contain these extra variables:  paginator: An instance of django.core.paginator.Paginator. page_obj: An instance of django.core.paginator.Page."  &lt;a href="http://docs.djangoproject.com/en/dev/ref/generic-views/#django-views-generic-list-detail-object-list"&gt;Django Generic views object_list&lt;/a&gt;:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-8381818979268132354?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/8381818979268132354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=8381818979268132354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8381818979268132354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8381818979268132354'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/django-generic-views-django.html' title='Django | Generic views | Django documentation'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1529861836116669372</id><published>2010-01-28T09:04:00.000-08:00</published><updated>2010-01-28T09:04:11.740-08:00</updated><title type='text'>Dynamic Inlines Built into Django Admin in 1.2</title><content type='html'>So I was talking at a Django round table last night and talking about the fixes I did to the dynamic inlines for the admin.  And someone mentioned that a)jquery is now included in Django 1.2 and b) dynmaic inlines are built in as well.
&lt;a href="http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/media/js/inlines.js?rev=12297"&gt;/django/trunk/django/contrib/admin/media/js/inlines.js&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1529861836116669372?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/media/js/inlines.min.js?rev=12297' title='Dynamic Inlines Built into Django Admin in 1.2'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1529861836116669372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1529861836116669372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1529861836116669372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1529861836116669372'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/dynamic-inlines-built-into-django-admin.html' title='Dynamic Inlines Built into Django Admin in 1.2'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3377904365259079761</id><published>2010-01-24T18:28:00.000-08:00</published><updated>2010-01-24T18:28:11.662-08:00</updated><title type='text'>Django CMS Photologue plugin with Gallerific</title><content type='html'>I just made a fork of the django cms photologue plugin with gallerific jquery gallery
&lt;a href="http://bitbucket.org/justhamade/cmsplugin-photologue/"&gt;Django CMS Photologue plugin with Gallerific&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3377904365259079761?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://bitbucket.org/justhamade/cmsplugin-photologue/' title='Django CMS Photologue plugin with Gallerific'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3377904365259079761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3377904365259079761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3377904365259079761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3377904365259079761'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/django-cms-photologue-plugin-with.html' title='Django CMS Photologue plugin with Gallerific'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-8927218323823768039</id><published>2010-01-22T15:13:00.000-08:00</published><updated>2010-01-28T09:10:52.872-08:00</updated><title type='text'>Django snippets: jQuery Double Click Edit ManyToMany in Admin</title><content type='html'>Take a look at my code on django snippets.  Just drop this into your templates/admin/change_form.html and any select for a foreign key or many to many will allow a double click to pop up and edit&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.djangosnippets.org/snippets/1884/"&gt;Django snippets: jQuery Double Click Edit ManyToMany in Admin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-8927218323823768039?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/8927218323823768039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=8927218323823768039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8927218323823768039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8927218323823768039'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/django-snippets-jquery-double-click.html' title='Django snippets: jQuery Double Click Edit ManyToMany in Admin'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1181194366012032710</id><published>2010-01-14T11:46:00.000-08:00</published><updated>2010-01-14T11:46:14.889-08:00</updated><title type='text'>Fabric, Django, Git, Apache, mod_wsgi, virtualenv and pip deployment | Morethanseven</title><content type='html'>&lt;div&gt;Another good example of django deployments with fabric&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://morethanseven.net/2009/07/27/fabric-django-git-apache-mod_wsgi-virtualenv-and-p/"&gt;Fabric, Django, Git, Apache, mod_wsgi, virtualenv and pip deployment | Morethanseven&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1181194366012032710?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://morethanseven.net/2009/07/27/fabric-django-git-apache-mod_wsgi-virtualenv-and-p/' title='Fabric, Django, Git, Apache, mod_wsgi, virtualenv and pip deployment | Morethanseven'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1181194366012032710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1181194366012032710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1181194366012032710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1181194366012032710'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/fabric-django-git-apache-modwsgi.html' title='Fabric, Django, Git, Apache, mod_wsgi, virtualenv and pip deployment | Morethanseven'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7516737112954594329</id><published>2010-01-09T14:55:00.000-08:00</published><updated>2010-01-09T14:55:01.132-08:00</updated><title type='text'>Web Form Design Patterns: Sign-Up Forms - Smashing Magazine</title><content type='html'>&lt;a href="http://www.smashingmagazine.com/2008/07/04/web-form-design-patterns-sign-up-forms/"&gt;Web Form Design Patterns: Sign-Up Forms - Smashing Magazine&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7516737112954594329?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.smashingmagazine.com/2008/07/04/web-form-design-patterns-sign-up-forms/' title='Web Form Design Patterns: Sign-Up Forms - Smashing Magazine'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7516737112954594329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7516737112954594329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7516737112954594329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7516737112954594329'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/web-form-design-patterns-sign-up-forms.html' title='Web Form Design Patterns: Sign-Up Forms - Smashing Magazine'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-8305490493874358764</id><published>2010-01-08T16:42:00.000-08:00</published><updated>2010-01-10T10:58:30.295-08:00</updated><title type='text'>How the Washington Post creates and deploys sites fast with virtualenv and Django</title><content type='html'>&lt;div&gt;Great tutorial for creating and easy process to deploy Django projects.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://opensource.washingtontimes.com/blog/post/coordt/2010/01/how-we-create-and-deploy-sites-fast-virtualenv-and/"&gt;How we create and deploy sites fast with virtualenv and Django | Open Source at The Washington Times&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-8305490493874358764?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/8305490493874358764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=8305490493874358764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8305490493874358764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/8305490493874358764'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/how-we-create-and-deploy-sites-fast.html' title='How the Washington Post creates and deploys sites fast with virtualenv and Django'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3290425850361691471</id><published>2010-01-08T16:38:00.000-08:00</published><updated>2010-01-08T16:38:40.087-08:00</updated><title type='text'>washingtontimes's django-repositories at master - GitHub</title><content type='html'>&lt;div&gt;Django App to battle trac ... finally, now if some one can incorporate time tracking and other PM into it that would be sweet, maybe I'll do that in my abundance of spare time.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://github.com/washingtontimes/django-repositories"&gt;washingtontimes's django-repositories at master - GitHub&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3290425850361691471?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://github.com/washingtontimes/django-repositories' title='washingtontimes&apos;s django-repositories at master - GitHub'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3290425850361691471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3290425850361691471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3290425850361691471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3290425850361691471'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/washingtontimess-django-repositories-at.html' title='washingtontimes&apos;s django-repositories at master - GitHub'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1184866843425701073</id><published>2010-01-08T08:52:00.000-08:00</published><updated>2010-01-08T08:52:13.359-08:00</updated><title type='text'>pyDanny: Picking a Django powered CMS</title><content type='html'>&lt;div&gt;I picked django-cms but now im second guessing myself :(&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://pydanny.blogspot.com/2009/11/picking-django-powered-cms.html"&gt;pyDanny: Picking a Django powered CMS&lt;/a&gt;: "http://code.google.com/p/django-page-cms/"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1184866843425701073?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://pydanny.blogspot.com/2009/11/picking-django-powered-cms.html' title='pyDanny: Picking a Django powered CMS'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1184866843425701073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1184866843425701073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1184866843425701073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1184866843425701073'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/pydanny-picking-django-powered-cms.html' title='pyDanny: Picking a Django powered CMS'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7138435845359999125</id><published>2010-01-07T08:55:00.000-08:00</published><updated>2010-01-07T08:55:51.634-08:00</updated><title type='text'>Ninja - A Nagios GUI Project</title><content type='html'>&lt;a href="http://www.op5.org/community/projects/ninja"&gt;Ninja - A Nagios GUI Project&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7138435845359999125?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.op5.org/community/projects/ninja' title='Ninja - A Nagios GUI Project'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7138435845359999125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7138435845359999125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7138435845359999125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7138435845359999125'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/ninja-nagios-gui-project.html' title='Ninja - A Nagios GUI Project'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3704557796589684740</id><published>2010-01-07T08:45:00.000-08:00</published><updated>2010-01-07T08:45:02.885-08:00</updated><title type='text'>Quick tip: how to convert tables to InnoDB</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 13px; color: rgb(58, 106, 139); line-height: 20px; white-space: nowrap; "&gt;apt-get install maatkit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 13px; color: rgb(58, 106, 139); line-height: 20px; white-space: nowrap; "&gt;mk-find &lt;db_name&gt; --engine MyISAM --exec &lt;span style="color: rgb(204, 0, 0); "&gt;"ALTER TABLE %D.%N ENGINE=INNODB"&lt;/span&gt; --print&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.mysqlperformanceblog.com/2008/07/30/quick-tip-how-to-convert-tables-to-innodb/"&gt;Quick tip: how to convert tables to InnoDB | MySQL Performance Blog&lt;/a&gt;:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3704557796589684740?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.mysqlperformanceblog.com/2008/07/30/quick-tip-how-to-convert-tables-to-innodb/' title='Quick tip: how to convert tables to InnoDB'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3704557796589684740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3704557796589684740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3704557796589684740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3704557796589684740'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/quick-tip-how-to-convert-tables-to.html' title='Quick tip: how to convert tables to InnoDB'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-5200655911353254644</id><published>2010-01-06T13:52:00.000-08:00</published><updated>2010-01-06T13:52:49.571-08:00</updated><title type='text'>Multiple Inserts with a Subquery | Code Spatter</title><content type='html'>&lt;a href="http://codespatter.com/2008/03/20/multiple-inserts-with-a-subquery/"&gt;Multiple Inserts with a Subquery | Code Spatter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-5200655911353254644?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://codespatter.com/2008/03/20/multiple-inserts-with-a-subquery/' title='Multiple Inserts with a Subquery | Code Spatter'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/5200655911353254644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=5200655911353254644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5200655911353254644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5200655911353254644'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/multiple-inserts-with-subquery-code.html' title='Multiple Inserts with a Subquery | Code Spatter'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3034296790951806956</id><published>2010-01-06T13:12:00.000-08:00</published><updated>2010-01-06T13:12:06.170-08:00</updated><title type='text'>Django Dynamic Formset</title><content type='html'>&lt;div&gt;I posted Previously about this jquery plugin.  I have just figured out a very plugable way to get this working in the admin with adding just one form.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Add the following to templates/admin/APP/MODEL/change_form.html and also update the MODEL in the prefix setting.
&lt;pre class="brush: python"&gt;
{% extends "admin/change_form.html" %}
{% load i18n admin_modify adminmedia %}
{% block extrahead %}
{{ block.super }}

  // Define this so we don't have to bother with the admin jsi18n stuff:
  function gettext(msgid) { return msgid; }

  $(function() {
      $('.inline-related tbody tr').formset({
   prefix: 'MODEL_set',
   addText: 'Add',
   deleteText: 'Delete',
  });
  });

  .add-row {
      padding-left:18px;
      background:url({% admin_media_prefix %}img/admin/icon_addlink.gif) no-repeat left center;
  }
  .delete-row {
      float:right;
      display:block;
      padding-left:18px;
      background:url({% admin_media_prefix %}img/admin/icon_deletelink.gif) no-repeat left center;
  }

{% endblock %}
&lt;/pre&gt;
&lt;/div&gt;&lt;div&gt;Thanks Stanislaus  &lt;/div&gt;&lt;a href="http://elo80ka.wordpress.com/2009/11/30/django-dynamic-formset-v1-1-released/#comment-28"&gt;Django Dynamic Formset&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3034296790951806956?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://elo80ka.wordpress.com/2009/11/30/django-dynamic-formset-v1-1-released/#comment-28' title='Django Dynamic Formset'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3034296790951806956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3034296790951806956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3034296790951806956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3034296790951806956'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/django-dynamic-formset.html' title='Django Dynamic Formset'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6140984297800468454</id><published>2010-01-05T02:36:00.000-08:00</published><updated>2010-01-05T02:36:17.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>philomat's django-form-designer at master - GitHub</title><content type='html'>&lt;a href="http://github.com/philomat/django-form-designer"&gt;philomat's django-form-designer at master - GitHub&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6140984297800468454?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6140984297800468454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6140984297800468454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6140984297800468454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6140984297800468454'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/philomats-django-form-designer-at.html' title='philomat&apos;s django-form-designer at master - GitHub'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-9071135132968501135</id><published>2010-01-01T20:18:00.000-08:00</published><updated>2010-01-01T20:18:34.737-08:00</updated><title type='text'>Download SpeedFan - Access temperature sensor in your computer</title><content type='html'>&lt;a href="http://www.almico.com/sfdownload.php"&gt;Download SpeedFan - Access temperature sensor in your computer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-9071135132968501135?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.almico.com/sfdownload.php' title='Download SpeedFan - Access temperature sensor in your computer'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/9071135132968501135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=9071135132968501135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/9071135132968501135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/9071135132968501135'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/download-speedfan-access-temperature.html' title='Download SpeedFan - Access temperature sensor in your computer'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7845662498685321006</id><published>2010-01-01T14:10:00.000-08:00</published><updated>2010-01-01T14:10:28.690-08:00</updated><title type='text'>howto:chroot_debian - DNS323Wiki</title><content type='html'>Installing debian on the DLink DNS323 NAS is really easy, just download and extact the files to the root directory and restart it.  &lt;div&gt;Default password is 12345678 make sure you reset it.  &lt;/div&gt;&lt;div&gt;Also update your &lt;i&gt;/etc/apt/source.list&lt;/i&gt; to lenny and &lt;i&gt;apt-get update&lt;/i&gt; (don't forget to &lt;i&gt;apt-get install debian-archive-keyring&lt;/i&gt;)
&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Files&lt;/div&gt;&lt;div&gt;&lt;a href="http://mesh.dl.sourceforge.net/sourceforge/debnas/debnas-0.5.tar.bz2"&gt;http://mesh.dl.sourceforge.net/sourceforge/debnas/debnas-0.5.tar.bz2&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Instructions&lt;/div&gt;&lt;a href="http://wiki.dns323.info/howto:chroot_debian"&gt;howto:chroot_debian - DNS323Wiki&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7845662498685321006?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wiki.dns323.info/howto:chroot_debian' title='howto:chroot_debian - DNS323Wiki'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7845662498685321006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7845662498685321006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7845662498685321006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7845662498685321006'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2010/01/howtochrootdebian-dns323wiki.html' title='howto:chroot_debian - DNS323Wiki'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1898131830703163081</id><published>2009-12-31T18:46:00.000-08:00</published><updated>2009-12-31T18:51:44.973-08:00</updated><title type='text'>XMBC and PowerDVD HTPC</title><content type='html'>Power DVD shortcut keys&lt;br /&gt;
&lt;a href="http://www.keyxl.com/aaab43b/275/PowerDVD-Ultra-keyboard-shortcuts.htm"&gt;PowerDVD Ultra Keyboard Shortcuts&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.keyxl.com/aaab43b/275/PowerDVD-Ultra-keyboard-shortcuts.htm"&gt;&lt;/a&gt;  XBMC Launcher&lt;br /&gt;
&lt;a href="http://code.google.com/p/xbmc-launcher/wiki/Main"&gt;http://code.google.com/p/xbmc-launcher/wiki/Main&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Intel Board&lt;br /&gt;
&lt;a href="http://www.ncix.com/products/?sku=32612&amp;amp;vpn=BOXDG45FC&amp;amp;manufacture=Intel"&gt;http://www.ncix.com/products/?sku=32612&amp;amp;vpn=BOXDG45FC&amp;amp;manufacture=Intel&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1898131830703163081?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1898131830703163081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1898131830703163081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1898131830703163081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1898131830703163081'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/xmbc-and-powerdvd-htpc.html' title='XMBC and PowerDVD HTPC'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4180896228121468400</id><published>2009-12-30T08:11:00.000-08:00</published><updated>2009-12-30T08:11:29.232-08:00</updated><title type='text'>Howto: Make RML templates from Openoffice.org ODT files | SOASI</title><content type='html'>&lt;a href="http://www.soasi.com/2009/12/make-rml-templates-from-openoffice-org-odt-files/"&gt;Howto: Make RML templates from Openoffice.org ODT files | SOASI&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4180896228121468400?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.soasi.com/2009/12/make-rml-templates-from-openoffice-org-odt-files/' title='Howto: Make RML templates from Openoffice.org ODT files | SOASI'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4180896228121468400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4180896228121468400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4180896228121468400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4180896228121468400'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/howto-make-rml-templates-from.html' title='Howto: Make RML templates from Openoffice.org ODT files | SOASI'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7093206203762540893</id><published>2009-12-24T11:07:00.000-08:00</published><updated>2009-12-24T11:07:29.091-08:00</updated><title type='text'>Django Cheat Sheet</title><content type='html'>A very good cheat sheet include Time and Date info
&lt;a href="http://www.mercurytide.co.uk/media/whitepapers/django-cheat-sheet/django10-cheat-sheet-grayscale.pdf"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7093206203762540893?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.mercurytide.co.uk/media/whitepapers/django-cheat-sheet/django10-cheat-sheet-grayscale.pdf' title='Django Cheat Sheet'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7093206203762540893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7093206203762540893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7093206203762540893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7093206203762540893'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/django-cheat-sheet.html' title='Django Cheat Sheet'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2731750828101377395</id><published>2009-12-22T15:48:00.000-08:00</published><updated>2009-12-22T15:48:48.479-08:00</updated><title type='text'>django-dynamic-formset</title><content type='html'>A nice simple jquery plugin to make dynameic formsets
&lt;a href="http://code.google.com/p/django-dynamic-formset/"&gt;django-dynamic-formset&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2731750828101377395?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/django-dynamic-formset/' title='django-dynamic-formset'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2731750828101377395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2731750828101377395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2731750828101377395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2731750828101377395'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/django-dynamic-formset.html' title='django-dynamic-formset'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4676615974437406821</id><published>2009-12-21T15:57:00.000-08:00</published><updated>2009-12-21T15:57:00.733-08:00</updated><title type='text'>Source interface with Python and urllib2 - Stack Overflow</title><content type='html'>A monkey patch to change your source interface with python
&lt;a href="http://stackoverflow.com/questions/1150332/source-interface-with-python-and-urllib2"&gt;Source interface with Python and urllib2&lt;/a&gt; 
&lt;pre class="brush: python"&gt;
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
    sock = true_socket(*a, **k)
    sock.bind((sourceIP, 0))
    return sock
socket.socket = bound_socket
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4676615974437406821?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://stackoverflow.com/questions/1150332/source-interface-with-python-and-urllib2' title='Source interface with Python and urllib2 - Stack Overflow'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4676615974437406821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4676615974437406821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4676615974437406821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4676615974437406821'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/source-interface-with-python-and.html' title='Source interface with Python and urllib2 - Stack Overflow'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1533015376559266985</id><published>2009-12-15T08:28:00.000-08:00</published><updated>2009-12-15T08:28:52.825-08:00</updated><title type='text'>SplitSettings - Django</title><content type='html'>No sure why they don't set this up by default but the best way to setup your media and template paths is:
&lt;pre class="brush: python"&gt;
DIRNAME = os.path.abspath(os.path.dirname(__file__))
DATABASE_NAME = os.path.join(DIRNAME, 'project.db')
MEDIA_ROOT = os.path.join(DIRNAME,'media')
TEMPLATE_DIRS = (
    os.path.join(DIRNAME,'templates'),
)
&lt;/pre&gt;
&lt;a href="http://code.djangoproject.com/wiki/SplitSettings#Multiplesettingfilesimportingfromeachother"&gt;SplitSettings - Django - Trac&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1533015376559266985?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.djangoproject.com/wiki/SplitSettings#Multiplesettingfilesimportingfromeachother' title='SplitSettings - Django'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1533015376559266985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1533015376559266985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1533015376559266985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1533015376559266985'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/splitsettings-django.html' title='SplitSettings - Django'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7767349358220236800</id><published>2009-12-15T07:28:00.000-08:00</published><updated>2009-12-15T07:28:43.043-08:00</updated><title type='text'>Inlines support for Django generic views</title><content type='html'>Django generic views are missing one major feature, inline forms.  This class is a drop in that adds the functionality.

&lt;a href="http://wadofstuff.blogspot.com/2009/07/inlines-support-for-django-generic.html"&gt;Wad of Stuff: Inlines support for Django generic views&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7767349358220236800?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wadofstuff.blogspot.com/2009/07/inlines-support-for-django-generic.html' title='Inlines support for Django generic views'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7767349358220236800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7767349358220236800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7767349358220236800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7767349358220236800'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/inlines-support-for-django-generic_15.html' title='Inlines support for Django generic views'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2330037972140491775</id><published>2009-12-13T07:58:00.000-08:00</published><updated>2009-12-13T07:58:18.682-08:00</updated><title type='text'>How to use *args and **kwargs in Python</title><content type='html'>A good example of kwargs and args
&lt;a href="http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/"&gt;How to use *args and **kwargs in Python &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2330037972140491775?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/' title='How to use *args and **kwargs in Python'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2330037972140491775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2330037972140491775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2330037972140491775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2330037972140491775'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/how-to-use-args-and-kwargs-in-python.html' title='How to use *args and **kwargs in Python'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6811132646927043722</id><published>2009-12-12T16:19:00.000-08:00</published><updated>2009-12-12T16:20:35.470-08:00</updated><title type='text'>Lazy choices in Django form</title><content type='html'>A cool library that django has the doesn't seem to be documented very well
&lt;pre class='brush: python'&gt;
from django.utils.functional import lazy

class CarSearchForm(forms.Form):  
    # lots of fields like this
    bodystyle = forms.ChoiceField(choices=lazy(bodystyle_choices, tuple)())
&lt;/pre&gt;


&lt;a href="http://stackoverflow.com/questions/569696/lazy-choices-in-django-form"&gt;Lazy choices in Django form - Stack Overflow&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6811132646927043722?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6811132646927043722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6811132646927043722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6811132646927043722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6811132646927043722'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/lazy-choices-in-django-form.html' title='Lazy choices in Django form'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6351214806540044250</id><published>2009-12-10T09:50:00.000-08:00</published><updated>2009-12-10T09:50:16.175-08:00</updated><title type='text'>Python get IP of interface</title><content type='html'>&lt;a href="http://code.activestate.com/recipes/439094/"&gt;Recipe 439094: get the IP address associated with a network interface (linux only) &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6351214806540044250?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.activestate.com/recipes/439094/' title='Python get IP of interface'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/6351214806540044250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=6351214806540044250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6351214806540044250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6351214806540044250'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/python-get-ip-of-interface.html' title='Python get IP of interface'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-5753509147619252137</id><published>2009-12-10T09:37:00.000-08:00</published><updated>2009-12-10T09:41:16.789-08:00</updated><title type='text'>Simple Python ping method</title><content type='html'>&lt;pre class="brush: python"&gt;
def ping(host):
    result = subprocess.call(["ping","-c","1",host],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    if result == 0:
        return True
    elif result == 1:
        raise Exception('Host not found')
    elif result == 2:
        raise Exception('Ping timed out')
&lt;/pre&gt;

useage:
&lt;pre class="brush: python"&gt;
try:
    ping('192.168.100.100')
except Exception:
    print "Ping error"
    raise
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-5753509147619252137?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/5753509147619252137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=5753509147619252137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5753509147619252137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5753509147619252137'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/python-ping.html' title='Simple Python ping method'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-5794859182932299837</id><published>2009-12-09T12:42:00.000-08:00</published><updated>2009-12-09T12:42:45.401-08:00</updated><title type='text'>Django/Eclipse Debug</title><content type='html'>This is a sweet setup for Django development with eclipse to use debug to run manage.py runserver
&lt;a href="http://www.youtube.com/watch?v=fUrTpp7AfwA"&gt;YouTube - Django/Eclipse Debug&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-5794859182932299837?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=fUrTpp7AfwA' title='Django/Eclipse Debug'/><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/5794859182932299837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=5794859182932299837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5794859182932299837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/5794859182932299837'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/djangoeclipse-debug.html' title='Django/Eclipse Debug'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-346330607647124644</id><published>2009-12-09T12:40:00.000-08:00</published><updated>2009-12-09T12:40:56.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>search and replace with regular expressions in eclipse</title><content type='html'>Found a great way to do dynamic search and replace in eclipse.


&lt;a href="http://gleichmann.wordpress.com/2007/11/21/search-and-replace-with-regular-expressions-in-eclipse/"&gt;search and replace with regular expressions in eclipse&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-346330607647124644?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/346330607647124644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=346330607647124644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/346330607647124644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/346330607647124644'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/12/search-and-replace-with-regular_7784.html' title='search and replace with regular expressions in eclipse'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-9200027200383939858</id><published>2009-07-17T08:49:00.000-07:00</published><updated>2009-12-12T16:24:20.338-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Foreign Key in Hidden Field</title><content type='html'>In order to have a hidden foreign key your in your form class you need to specify:
&lt;pre class="brush: python"&gt;
class PlanForm(forms.ModelForm):    
    owner = forms.ModelChoiceField(label="",queryset=Profile.objects.all(),widget=forms.HiddenInput())
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-9200027200383939858?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/9200027200383939858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=9200027200383939858' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/9200027200383939858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/9200027200383939858'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/07/another-django-forms-foreign-key-in.html' title='Foreign Key in Hidden Field'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4918771793829045719</id><published>2009-07-17T08:05:00.000-07:00</published><updated>2009-07-17T08:51:21.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Class definition order between two related classes</title><content type='html'>I ran into an issue where I wanted to have a foreign key to one class then over ride the save in the other class to update the current class.  It would through and error because one of the classes was not defined.  I finally found this post &lt;a href="http://groups.google.com/group/django-developers/browse_thread/thread/f71db48c87561ad4"&gt;Class definition order between two related classes&lt;/a&gt; and see that you can but the models name in quotes in the foreign key.

example:
&lt;pre class="brush: python"&gt;
class Foo(models.Model):
    bar = models.ForeignKey("Bar")
    name = models.CharField(max_length=100)

class Bar(models.Model):
    name = models.CharField(max_length=100)
    def save(self):
        foos = Foo.objects.filter(item=self)         
        foos.update(name=self.name)
        super(Bar, self).save()

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4918771793829045719?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4918771793829045719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4918771793829045719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4918771793829045719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4918771793829045719'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/07/class-definition-order-between-two.html' title='Class definition order between two related classes'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3403707465927011868</id><published>2009-04-23T11:25:00.000-07:00</published><updated>2009-04-23T12:44:48.119-07:00</updated><title type='text'>Django Custom Permissions ... sorta</title><content type='html'>There is no built in way to do row level permissions in Django, yet (&lt;a href="http://code.djangoproject.com/wiki/RowLevelPermissions"&gt;see here&lt;/a&gt;)

I have found a few hacks to get around this in the admin section.  This is using 1.0.2

First add a Foreign key to the model this is an example models.py
&lt;pre class="brush: python"&gt;
from django.contrib.auth.models import User, Group
from django.db import models

class MyModel(models.Model):
   name = models.CharField(max_lenght=100)
   group = models.ForeignKey(Group)
&lt;/pre&gt;
Then in admin.py we need to override the queryset so that the user can only see objects that are part of his group and that he can only add objects that belong to his group
&lt;pre class="brush: python"&gt;
from django.contrib.auth.models import Group
from django.contrib import admin
from myproject.myapp.models import MyModel

class MyModelAdmin(admin.ModelAdmin):
   def __call__(self,request,url):
       self.request = request
       return super(DeviceAdmin, self).__call__(request,url)
   def formfield_for_dbfield(self, db_field, **kwargs):
       field = super(DeviceAdmin, self).formfield_for_dbfield(db_field, **kwargs)
       if not self.request.user.is_superuser and db_field.name == 'group':
           my_choices = [('', '---------')]
           my_choices.extend(
               Group.objects.filter(
                   name__in=self.request.user.groups.all()
               ).values_list('id','name')
           ) # This can be one line it just doesn't fit
           print my_choices
           field.choices = my_choices
       return field
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            group_qs = Group.objects.filter(name__in=request.user.groups.all())
            return qs.filter(group__in=group_qs)

admin.site.register(MyModel,MyModelAdmin)
&lt;/pre&gt;
Now if you setup the admin in your settings and urls the groups for MyModel will only show up if the user belongs to that group.  If the user is a super user they will see all the groups.  If they user does not belong to any groups then they will not see any groups.

Note: You can probably submit a post with the ID of a group that you do not belong to and it will work, I have not figured out how to add custom validation based on the request object yet.

Here are some links that I used as a reference:
http://stackoverflow.com/questions/430592/djang-admin-charfield-as-textarea
http://www.djangosnippets.org/snippets/414/
http://code.djangoproject.com/ticket/3987#comment:32&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3403707465927011868?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3403707465927011868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3403707465927011868' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3403707465927011868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3403707465927011868'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2009/04/django-custom-permissions-sorta.html' title='Django Custom Permissions ... sorta'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2355744041674032945</id><published>2008-03-11T11:27:00.000-07:00</published><updated>2009-12-12T16:24:03.087-08:00</updated><title type='text'>Installing MySQL and PHP4 with apache1.3</title><content type='html'>Continued from previous post
&lt;pre class="brush: bash"&gt;

#!/bin/bash
cd /usr/src

wget  http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.51a.tar.gz/from/http://mysql.mirror.rafal.ca/
tar xzvf mysql-5.0.51a.tar.gz
cd mysql-5.0.51a
groupadd mysql
useradd -g mysql mysql
./configure
make
make install
cp support-files/my-small.cnf /etc/my.cnf
cd /usr/local/mysql
chown -R mysql .
chgrp -R mysql .
bin/mysql_install_db --user=mysql
chown -R root .
chown -R mysql var
bin/mysqld_safe --user=mysql &amp;

wget http://ca3.php.net/get/php-4.4.8.tar.gz/from/ca.php.net/mirror
tar zxvf php-4.4.8.tar.gz
cd php-4.4.8
#assumes apache was configure as DSO
./configure --with-apxs=/usr/local/apache/bin/apxs
make
make install
&lt;/pre&gt;
Review /usr/local/apache/conf/httpd.conf
LoadModule php4_module libexec/libphp4.so should already be in the config file
Add or verify
Addtype application/x-httpd-php .php
Addtype application/x-httpd-php-source .phps&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2355744041674032945?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2355744041674032945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2355744041674032945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2355744041674032945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2355744041674032945'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2008/03/installing-mysql-and-php4-with-apache13.html' title='Installing MySQL and PHP4 with apache1.3'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-7905460419003301734</id><published>2008-03-11T11:15:00.000-07:00</published><updated>2009-04-23T12:32:13.349-07:00</updated><title type='text'>Install Apache with modssl from source</title><content type='html'>copy and paste the following into a new file then chmod it to 755
&lt;pre class="brush: bash"&gt;
#!/bin/bash

cd /usr/src
wget http://www.openssl.org/source/openssl-0.9.8g.tar.gz
tar xzvf openssl-0.9.8g.tar.gz
cd openssl-0.9.8g
./config
read -p "If ./config finished press enter to make"
make
read -p "If make finished press enter to make install"
make install
read -p "If make install finished press enter to install apache and modssl "

wget http://archive.apache.org/dist/httpd/apache_1.3.41.tar.gz
tar zxvf apache_1.3.41.tar.gz
wget http://www.modssl.org/source/mod_ssl-2.8.31-1.3.41.tar.gz
tar xzvf mod_ssl-2.8.31-1.3.41.tar.gz
cd mod_ssl-2.8.31-1.3.41
./configure --with-apache=../apache_1.3.41 \
 --with-ssl=../openssl-0.9.8g \
 --prefix=/usr/local/apache \
 --enable-shared=max
read -p "If ./configure finished press enter to make"
cd ../apache_1.3.41
make
read -p "If make finished press enter to make install"
make certificate
make install
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-7905460419003301734?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/7905460419003301734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=7905460419003301734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7905460419003301734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/7905460419003301734'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2008/03/install-apache-with-modssl-from-source.html' title='Install Apache with modssl from source'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-3591147008115451439</id><published>2008-01-03T08:58:00.001-08:00</published><updated>2009-04-23T12:38:51.399-07:00</updated><title type='text'>Asterisk Install Script for Debian</title><content type='html'>&lt;pre class="brush: bash"&gt;
#!/bin/bash

# Script to download and untar lastest asterisk build
# Justin Hamade v1 - March 24, 2007
# Justin Hamade v1.1 - May 28, 2007 - Added:
# 1. ability to install 1.2 or 1.4
# 2. dep check for wget, make, and gcc
# 3. install asterisk-gui option for 1.4


# ----------------------------------------------------------------------------
# Pause.
# ----------------------------------------------------------------------------
pause()
{

        if test $NONINTERACTIVE; then
                return 0
        fi

        [ $# -ne 0 ] &amp;amp;&amp;amp; echo -e $* &amp;gt;&amp;amp;2
        echo -e "Press [Enter] to continue...\c" &amp;gt;&amp;amp;2
        read tmp
        return 0
}
# ----------------------------------------------------------------------------
# Prompt user for input.
# Usage:
# prompt "Prompt"
# $CMD
# ----------------------------------------------------------------------------
prompt()
{
        if test $NONINTERACTIVE; then
                return 0
        fi

        echo -ne "$*" &amp;gt;&amp;amp;2
        read CMD rest
        return 0
}

# ----------------------------------------------------------------------------
# Get Yes/No
# Usage:
# getyn "\nWould you like to continue?" || return 1
# ----------------------------------------------------------------------------
getyn()
{
        if test $NONINTERACTIVE; then
                return 0
        fi

        while prompt "$* (y/n) "
        do      case $CMD in
                        [yY])   return 0
                                ;;
                        [nN])   return 1
                                ;;
                        *)      echo -e "\nPlease answer y or n" &amp;gt;&amp;amp;2
                                ;;
                esac
        done
}
# ----------------------------------------------------------------------------
# Get Version
# ----------------------------------------------------------------------------
getversion()
{
        if test $NONINTERACTIVE; then
                return 0
        fi

        while prompt "Enter $* minor version number (for 1.$BRANCH.0 enter 0 for 1.$BRANCH.1.1 enter 1.1): "
        do      case $CMD in
                        [0-9]|[1-2][0-9]|[0-9].[0-9]|[1-2][0-9].[0-9])
                                return 0
                                ;;
                        *)      echo -e "Please answer a number from 0 to 29" &amp;gt;&amp;amp;2
                                ;;
                esac
        done
}

getbranch()
{
        if test $NONINTERACTIVE; then
                return 0
        fi

        while prompt "Enter asterisk branch number (for 1.2 enter 2 for 1.4 enter 4): "
        do      case $CMD in
                        [2]|[4])
                                return 0
                                ;;
                        *)      echo -e "Please enter 2 or 4" &amp;gt;&amp;amp;2
                                ;;
                esac
        done
}

install_libpri ()
{
        getyn "Install libpri?" || return 1
        LIBPRIVERSION=0
        getversion "libpri"
        LIBPRIVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.digium.com/pub/libpri/libpri-1.$BRANCH.$LIBPRIVERSION.tar.gz
        tar zxvf libpri-1.$BRANCH.$LIBPRIVERSION.tar.gz
        rm libpri-1.$BRANCH.$LIBPRIVERSION.tar.gz
        cd $SRCDIR/libpri-1.$BRANCH.$LIBPRIVERSION
        make &amp;amp;&amp;amp; make install
        cd $SRCDIR
}

install_zaptel ()
{
        getyn "Install zaptel?" || return 1
        ZAPTELVERSION=1
        getversion "zaptel"
        ZAPTELVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.digium.com/pub/zaptel/zaptel-1.$BRANCH.$ZAPTELVERSION.tar.gz
        tar zxvf zaptel-1.$BRANCH.$ZAPTELVERSION.tar.gz
        rm zaptel-1.$BRANCH.$ZAPTELVERSION.tar.gz
        ln -s $SRCDIR/zaptel-1.$BRANCH.$ZAPTELVERSION /usr/src/zaptel
        cd $SRCDIR/zaptel-1.$BRANCH.$ZAPTELVERSION
        if [ "$BRANCH" = "4" ]; then
                ./configure &amp;amp;&amp;amp; make menuselect
        fi
        make &amp;amp;&amp;amp; make install
        cd $SRCDIR
}

install_asterisk ()
{
        getyn "Install asterisk?" || return 1
        ASTERISKVERSION=2
        getversion "asterisk"
        ASTERISKVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.digium.com/pub/asterisk/asterisk-1.$BRANCH.$ASTERISKVERSION.tar.gz
        tar zxvf asterisk-1.$BRANCH.$ASTERISKVERSION.tar.gz
        rm asterisk-1.$BRANCH.$ASTERISKVERSION.tar.gz
        cd $SRCDIR/asterisk-1.$BRANCH.$ASTERISKVERSION
        if [ "$BRANCH" = "4" ]; then
                ./configure &amp;amp;&amp;amp; make menuselect
        fi
        make &amp;amp;&amp;amp; make install
        cd $SRCDIR
}

install_addons ()
{
        getyn "Install asterisk-addons?" || return 1
        ADDONSVERSION=0
        getversion "addons"
        ADDONSVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.digium.com/pub/asterisk/asterisk-addons-1.$BRANCH.$ADDONSVERSION.tar.gz
        tar zxvf asterisk-addons-1.$BRANCH.$ADDONSVERSION.tar.gz
        rm asterisk-addons-1.$BRANCH.$ADDONSVERSION.tar.gz
        cd $SRCDIR/asterisk-addons-1.$BRANCH.$ADDONSVERSION
        if [ "$BRANCH" = "4" ]; then
                ./configure &amp;amp;&amp;amp; make menuselect
        fi
        make &amp;amp;&amp;amp; make install
        cd $SRCDIR
}
install_gui ()
{
        getyn "Install asterisk-gui?" || return 1
        cd $SRCDIR
        svn checkout http://svn.digium.com/svn/asterisk-gui/trunk asterisk-gui
        cd $SRCDIR/asterisk-gui
        ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install &amp;amp;&amp;amp; make samples
        cd $SRCDIR
}
install_sounds ()
{
        getyn "Install asterisk-sounds?" || return 1
        SOUNDSVERSION=0
        getversion "sounds"
        SOUNDSVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.digium.com/pub/asterisk/asterisk-sounds-1.$BRANCH.$ADDONSVERSION.tar.gz
        tar zxvf asterisk-sounds-1.$BRANCH.$SOUNDSVERSION.tar.gz
        rm asterisk-sounds-1.$BRANCH.$SOUNDSVERSION.tar.gz
        cd $SRCDIR/asterisk-sounds-1.$BRANCH.$SOUNDSVERSION
        make install
        cd $SRCDIR
}
install_wanpipe ()
{
        getyn "Install sangoma wanpipe?" || return 1
        prompt "Enter wanpipe version (ie 2.3.4-9 or 3.1.0)"
        WANPIPEVERSION=$CMD
        cd $SRCDIR
        wget ftp://ftp.sangoma.com/linux/current_wanpipe/wanpipe-$WANPIPEVERSION.tgz
        tar zxvf wanpipe-$WANPIPEVERSION.tgz
        rm wanpipe-$WANPIPEVERSION.tgz
        cd $SRCDIR/wanpipe-$WANPIPEVERSION
        ./Setup install
        cd $SRCDIR
}

banner ()
{
        cat &amp;lt;&amp;lt; ENDOFTEXT
This script will download and install Asterisk 1.2 or 1.4 and its required packages including Sangoma drivers.
ENDOFTEXT
pause
}

checkwget ()
{
        echo "Checking wget ...";
        if [ ! -x $WGET ]; then
                getyn "wget not installed run, apt-get install wget?" || return 1
                apt-get install wget
        fi
        echo "success"
}
checkmake ()
{
        echo "Checking make ...";
        if [ ! -x $MAKE ]; then
                getyn "make not installed, run apt-get install make?" || return 1
                apt-get install make
        fi
        echo "success"
}
checkgcc ()
{
        echo "Checking gcc ...";
        if [ ! -x $GCC ]; then
                getyn "gcc not installed, run apt-get install gcc?" || return 1
                apt-get install gcc
        fi
        echo "success"
}


banner
WGET=/usr/bin/wget
checkwget
MAKE=/usr/bin/make
checkmake
GCC=/usr/bin/gcc
checkgcc
getbranch
BRANCH=$CMD

SRCDIR="/usr/src/asterisk-1.$BRANCH"
if [ -d $SRCDIR ]; then
        echo "directory exsists"
else
        mkdir $SRCDIR
fi
cd $SRCDIR

install_libpri
install_zaptel
install_asterisk
install_addons
if [ "$BRANCH" = "2" ]; then
        install_sounds
fi
if [ "$BRANCH" = "4" ]; then
        install_gui
fi
install_wanpipe&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-3591147008115451439?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/3591147008115451439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=3591147008115451439' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3591147008115451439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/3591147008115451439'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2008/01/asterisk-install-script-for-debian.html' title='Asterisk Install Script for Debian'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4723170542815461661</id><published>2007-12-07T09:38:00.001-08:00</published><updated>2009-04-23T12:39:16.271-07:00</updated><title type='text'>My stdexten macro</title><content type='html'>I always forget this so I figure I will post it and update it when I improve it.

&lt;pre class="brush: bash"&gt;
[macro-stdexten]
;ARG1 = Device(s) to ring (Default SIP/${MACRO_EXTEN}
;ARG2 = Voicemail Box to go to (Default ${MACRO_EXTEN}
;ARG3 = Timeout in seconds (divide be 5 for number of rings) default 20

exten =&amp;gt; s,1,NoOp
exten =&amp;gt; s,n,Set(DIALSTRING=${IF($[ "${ARG1}" = "" ]?SIP/${MACRO_EXTEN}:${ARG1})})
exten =&amp;gt; s,n,Set(VMAILBOX=${IF($[ "${ARG2}" = "" ]?${MACRO_EXTEN}:${ARG2})})
exten =&amp;gt; s,n,Set(TIMEOUT=${IF($[ "${ARG3}" = "" ]?20:${ARG3})})
exten =&amp;gt; s,n,Dial(${DIALSTRING},${TIMEOUT},twk)
exten =&amp;gt; s,n,Goto(s-${DIALSTATUS},1)

exten =&amp;gt; s-,1,Goto(s-BUSY,1)
exten =&amp;gt; _s-.,1,Goto(s-BUSY,1)
exten =&amp;gt; s-CONGESTION,1,Goto(s-BUSY,1)

exten =&amp;gt; s-BUSY,1,Voicemail(${VMAILBOX}@default,b)
exten =&amp;gt; s-BUSY,n,Hangup()

exten =&amp;gt; s-CHANUNAVAIL,1,Goto(s-NOANSWER,1)

exten =&amp;gt; s-NOANSWER,1,Voicemail(${VMAILBOX}@default,u)
exten =&amp;gt; s-NOANSWER,n,Hangup
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4723170542815461661?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4723170542815461661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4723170542815461661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4723170542815461661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4723170542815461661'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/12/my-stdexten-macro.html' title='My stdexten macro'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-1569627639436217792</id><published>2007-11-28T19:38:00.000-08:00</published><updated>2007-12-05T22:27:29.725-08:00</updated><title type='text'>Document Design for Search Engine Optimization</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.searchengineoptimizationcompany.ca/img/Search-Engine-Marketing.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.searchengineoptimizationcompany.ca/img/Search-Engine-Marketing.jpg" alt="" border="0" /&gt;&lt;/a&gt;

Digital document design has become much more then just aesthetics and it is now important that a document can be read by "robots" as well a people.  Robots, or crawlers or spiders, are another name for indexing services that search engines use such as google. As you are well aware, search engines are the way people find most things on the web today.  Most people assume that search engines use hidden meta tags to index web pages for searching.  This may have been the case in the early days of the web, and is only partially true for a few search engines today.  Search engines are now programmed to look at the text inside html tags that are used to design a web page.  Weight is given to the words depending on which tag they are in.  This is how Search Engine Optimization, or SEO, relates to document design.  I will discuss the tags that are important to making your site search engine friendly, and some ways to keep the design you want.

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.weboma.com/images/posts/title.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.weboma.com/images/posts/title.jpg" alt="" border="0" /&gt;&lt;/a&gt;First off is the title tag, this should be descriptive as to who you are and what information you are presenting in your page.  The title tag should also stay short and not be greater the 60 - 70 characters. Keep in mind that the title tag is not only something that search engines use to find keywords to your site, but it is also what the user will see in their search results.

Heading tags are also regarded as important content, as they are meant to be headings on your tags. Designers often use images as headings, but these will not only require descriptive alt attributes, but also are weighted very low by search engine crawlers.  Cascading style sheets (CSS) can also be used to design headings, but be when using CSS make sure to apply your CSS to the heading tag and not to another block element tag, like span or div.

Make sure to use descriptive keywords in your ALT attribute for your image tags.  This will help search engines that index images as the image file name is not always relative to the picture.  The alt tag is included as body text by most search engines, but as mentioned previously is weighted low.

Meta tags are still used by some search engines but are weighted very low due to over use.  For the Meat Description tag, it is best to keep it under 100 characters. The meta tag is also important because it is displayed in the search results.  For the Meta Keyword tag, it should be kept under 250 keywords, and should not contain any words that are not in the document.

As mentioned previously search engine crawlers can not index images, this is something that many designers have problems with for a few reasons.  First text is difficult to control, even when using CSS to format it.  The user must have that font installed, and the user can increase and decrease the font size in their browser easily.  Images solve these problems for a designer  because they can not be changed, but images will hinder its search engine optimization.

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.inventatech.co.uk/images/seo-chart.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.inventatech.co.uk/images/seo-chart.gif" alt="" border="0" /&gt;&lt;/a&gt;The last and probably most important part of search engine optimization are links.  I will referrer to two different types of links, internal and external.  Internal links are things like menus and site maps.  It is important to have at least one static link to every page on your site that you want indexed.  This is so the search engines know how to get to every page when they spider or crawl your site.  External links referrer to other sites that link back to yours.  This is another way that search engines rank your site.  This is unrelated to design so there is no need to go into any more detail about it.

As with everything, there are people out there that abuse the system, so search engines have put measures into place to not rank these types of sites highly.  Some things I have already mentioned like number of characters in title and meta tags. One additional thing to be careful of is to keep the number of links on one page to under 100, more than 100 links we be thought of as spam.  For a large site map it would be a good idea to split it up into  multiple pages.  Another thing to be careful of is using the same words an excessive amount on a single page.  This is a common practice for people trying to trick search engines.

Currently there is a battle between designers and search engine optimization people.  Both are important elements of marketing your site and your business on the web, but they have contradicting requirements.  As discussed many design needs are not SEO friendly, and many SEO needs are not design friendly.  Make sure you find a good middle ground when designing your site.

References:&lt;a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;amp;answer=40349"&gt;
&lt;span style="font-weight: bold;font-family:arial;font-size:85%;"  &gt; How can I create a Google-friendly site?&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;
&lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:85%;"  &gt;&lt;a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;amp;answer=35769"&gt; Webmaster Guidelines&lt;/a&gt;
&lt;a href="http://www.bruceclay.com/emergingstandards.htm"&gt;Search Engine Optimization Standards and Spam Discussion&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;
&lt;a style="font-weight: bold;" href="http://www.interspire.com/content/articles/13/1/Google-SEO-Basics-for-Beginners"&gt;Google SEO Basics for Beginners&lt;/a&gt;
&lt;a style="font-weight: bold;" href="http://www.mediacollege.com/internet/search-engines/seo/basics.html"&gt;Media College.com SEO Basics &lt;/a&gt;
&lt;a style="font-weight: bold;" href="http://www.googlerankings.com/basic.php"&gt;Google Rankings Basic SEO advice&lt;/a&gt;
&lt;a style="font-weight: bold;" href="http://www.searchengineguide.com/jim-hedger/seo-101-basic.php"&gt;&lt;strong&gt;SEO 101 - Basic Optimization Techniques&lt;/strong&gt;&lt;/a&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-1569627639436217792?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/1569627639436217792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=1569627639436217792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1569627639436217792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/1569627639436217792'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/11/document-design-for-search-engine.html' title='Document Design for Search Engine Optimization'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-2049937619885181799</id><published>2007-10-20T09:32:00.001-07:00</published><updated>2007-10-21T13:28:06.478-07:00</updated><title type='text'>Mythtv Distro Evaluations</title><content type='html'>It is a tough time for Mythtv distros right now with Zap2it cancelling their services is August.  There are 4 major mythtv distro communities right now, knoppmyth, mythdora, mythbuntn and linuxmce.  Today I tried all but knoppmyth and here is what I have found.

LinuxMCE
I first tried LinuxMCE as the demo video they have on their site shows some amazing features.  They do have an update for the new Schedules direct service but the link to the script was down.  The thing that I found about LinuxMCE was that because it is a bunch of custom changes on top of Kubuntu Feisty, updating myth from the Kubuntu repository would break it.  This is a cool system but is a bit behind when on changes.

Mythdora
Mythdora acutally looked good, they have some myth specific questions at install.  The downside I found was the myth version was still the older one and there was no Schedules direct support, also the links for the update at the atrpms site was down as well.

Mythbuntu
Mythbuntu is a supported ubuntu distro and is kept almost as up to date as ubuntu is.  Right now they have a 7.10 release candidate and the 7.10 version has only been released for a few days at this point.  The good thing is it has the newest version of myth and the Schedules Direct is supported right out of the box, no updates needs.

Ubuntu again comes through leading the pack with the most up to date distro in mythbuntu.

If anyone has comments on these distros or any other I would love to hear them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-2049937619885181799?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/2049937619885181799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=2049937619885181799' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2049937619885181799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/2049937619885181799'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/10/mythtv-distro-evaluations.html' title='Mythtv Distro Evaluations'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-4465643841969271132</id><published>2007-04-19T10:14:00.000-07:00</published><updated>2007-05-04T12:27:52.178-07:00</updated><title type='text'>Polycom Presence and SIP 500 errors</title><content type='html'>I finally got someone at Polycom support that knew what they were talking about and were very helpful. I have been getting a lot of these errors from the Polycoms on my asterisk servers &lt;span style="FONT-STYLE: italic"&gt;Incoming call: Got SIP response 500 "Internal Server Error" back from 192.168.0.100&lt;/span&gt;

The problem was the transport was set to "DNSnaptr" by default. So if you set it to "TCPpreferred" it should fix any issues you are having with presence and also any sip 500 errors.

EDIT*
I am still getting sip 500 errors if I restart asterisk and not the polycom phones.  On a side note for asterisk 1.4 make sure call-limit is set to something.  I set it to 8.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-4465643841969271132?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/4465643841969271132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=4465643841969271132' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4465643841969271132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/4465643841969271132'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/04/polycom-presence-and-sip-500-errors.html' title='Polycom Presence and SIP 500 errors'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-6168829669718671121</id><published>2007-03-22T22:10:00.000-07:00</published><updated>2007-03-22T23:05:52.644-07:00</updated><title type='text'>Provisioning Polycom phones</title><content type='html'>Provisioning Polycom SIP phones can be a pain.  There are some good examples on www.voip-info.org but I think a explanation would be a good idea.

For an internal LAN setup TFTP is easiest, so I have everything setup as so:
/tftpboot
/tftpboot/contacts
/tftpboot/logs
/tftpboot/overrides

The important thing is DO NOT touch sip.cfg, phone1.cfg and 000000000000.cfg, use it as reference only.  Why you ask, so when new firmware comes out you just drop in the new file.

So where do you make your changes then????
&lt;ol&gt;&lt;li&gt;MAC.cfg
&lt;/li&gt;&lt;li&gt;EXTEN.cfg&lt;/li&gt;&lt;li&gt;00000000000-directory.cfg&lt;/li&gt;&lt;li&gt;contacts/MAC-directory.cfg&lt;/li&gt;&lt;/ol&gt;Here are some examples:
MAC.cfg:
&amp;lt;?xml version="1.0" standalone="yes"?&amp;gt;
&amp;lt;!-- Default Master SIP Configuration File--&amp;gt;
&amp;lt;!-- Edit and rename this file to &amp;lt;Ethernet-address&amp;gt;.cfg for each phone.--&amp;gt;
&amp;lt;!-- $Revision: 1.14 $  $Date: 2005/07/27 18:43:30 $ --&amp;gt;
&amp;lt;APPLICATION APP_FILE_PATH="sip.ld" CONFIG_FILES="300.cfg, site.cfg, phone1.cfg, sip.cfg" MISC_FILES="" LOG_FILE_DIRECTORY="/log" OVERRIDES_DIRECTORY="/overrides" CONTACTS_DIRECTORY="/contacts"/&amp;gt;


EXTEN.cfg (300.cfg)
&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;
&amp;lt;!-- Per-phone configuration in this file --&amp;gt;
&amp;lt;reginfo&amp;gt;
       &amp;lt;reg reg.1.displayName="First Last" reg.1.address="300" reg.1.label="300" reg.1.auth.userId="300" reg.1.auth.password="PASSWORD"/&amp;gt;
&amp;lt;/reginfo&amp;gt;
&amp;lt;msg&amp;gt;
       &amp;lt;mwi msg.mwi.1.subscribe="300@default"/&amp;gt;
&amp;lt;/msg&amp;gt;

site.cfg
&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;
&amp;lt;!-- Our local phone system common configuration in this file --&amp;gt;
&amp;lt;localcfg&amp;gt;
&amp;lt;server voIpProt.server.1.address="192.168.0.1"/&amp;gt;
&amp;lt;SIP&amp;gt;
  &amp;lt;outboundProxy voIpProt.SIP.outboundProxy.address="192.168.0.1"/&amp;gt;
&amp;lt;/SIP&amp;gt;
&amp;lt;TCP_IP&amp;gt;
  &amp;lt;SNTP tcpIpApp.sntp.daylightSavings.enable="1"
       tcpIpApp.sntp.resyncPeriod="86400"
       tcpIpApp.sntp.address="192.168.0.1"
       tcpIpApp.sntp.address.overrideDHCP="1"
       tcpIpApp.sntp.gmtOffset="-28800"
       tcpIpApp.sntp.gmtOffset.overrideDHCP="1"
       tcpIpApp.sntp.daylightSavings.enable="1"
       tcpIpApp.sntp.daylightSavings.fixedDayEnable="1"
       tcpIpApp.sntp.daylightSavings.start.month="3"
       tcpIpApp.sntp.daylightSavings.start.date="8"
       tcpIpApp.sntp.daylightSavings.start.time="2"
       tcpIpApp.sntp.daylightSavings.start.dayOfWeek="1"
       tcpIpApp.sntp.daylightSavings.start.dayOfWeek.lastInMonth="0"
       tcpIpApp.sntp.daylightSavings.stop.month="11"
       tcpIpApp.sntp.daylightSavings.stop.date="1"
       tcpIpApp.sntp.daylightSavings.stop.time="2"
       tcpIpApp.sntp.daylightSavings.stop.dayOfWeek="1"
       tcpIpApp.sntp.daylightSavings.stop.dayOfWeek.lastInMonth="0"
/&amp;gt;
&amp;lt;/TCP_IP&amp;gt;
&amp;lt;reg&amp;gt;
       &amp;lt;reg.1.callsPerLineKey="8"&amp;gt;
&amp;lt;/reg&amp;gt;
&amp;lt;msg&amp;gt;
       &amp;lt;mwi msg.mwi.1.callBackMode="contact" msg.mwi.1.callBack="8500" /&amp;gt;
&amp;lt;/msg&amp;gt;
&amp;lt;user_preferences up.oneTouchVoiceMail="1" /&amp;gt;
&amp;lt;feature feature.1.enabled="1" feature.9.enabled="0" feature.10.enabled="1" feature.11.enabled="1" feature.12.enabled="1" /&amp;gt;
&amp;lt;bitmap&amp;gt;
       &amp;lt;IP_400 bitmap.IP_400.61.name="Idle400.bmp"/&amp;gt;
       &amp;lt;IP_600 bitmap.IP_600.61.name="Idle600.bmp"/&amp;gt;
&amp;lt;/bitmap&amp;gt;
&amp;lt;sound_effects se.stutterOnVoiceMail="0" /&amp;gt;
&amp;lt;localcfg&amp;gt;

contacts/MAC-directory.xml:
&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;
&amp;lt;!-- $Revision: 1.2 $  $Date: 2004/12/21 18:28:05 $ --&amp;gt;
&amp;lt;directory&amp;gt;
        &amp;lt;item_list&amp;gt;
        &amp;lt;item&amp;gt;&amp;lt;fn&amp;gt;First&amp;lt;/fn&amp;gt;&amp;lt;ln&amp;gt;Last&amp;lt;/ln&amp;gt;&amp;lt;ct&amp;gt;301&amp;lt;/ct&amp;gt;&amp;lt;sd&amp;gt;1&amp;lt;/sd&amp;gt;&amp;lt;bw&amp;gt;1&amp;lt;/bw&amp;gt;&amp;lt;/item&amp;gt;

Some gotchas that I have run into:
&lt;ol&gt;&lt;li&gt;/tftpboot/contacts/00000000000-directory.xml does not get used it gets pulled from the /tftpboot/000000000000-directory.xml file (as of bootrom v3.2.2)&lt;/li&gt;&lt;li&gt;The dhcp option to set the tftp server is &lt;span style="font-weight: bold;"&gt;option tftp-sever-name "tftp://192.168.41.1"&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Take a look here if you need more info or more examples or email me.
&lt;a href="http://www.voip-info.org/wiki-Polycom+Phones#PolycomConfigFiles"&gt;http://www.voip-info.org/wiki-Polycom+Phones#PolycomConfigFiles&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-6168829669718671121?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6168829669718671121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/6168829669718671121'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/03/provisioning-polycom-phones.html' title='Provisioning Polycom phones'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-117071286592430704</id><published>2007-02-05T13:55:00.000-08:00</published><updated>2007-03-13T16:45:06.439-07:00</updated><title type='text'>Linux still not a good desktop</title><content type='html'>So I figured I would bite the bullet and give Kubuntu another go as my desktop.  The install was easy, it supported all my hardware out of the box and I was happy.

I even spent a bunch of time  getting Beryl to work and that was sweet, but then the bugs started.

A list of tasks I needed to be able to accoplish
&lt;ul&gt;&lt;li&gt;I wanted to connect to Exchange and Evolution is pretty good at that now.&lt;/li&gt;&lt;li&gt;I can get to the file server at work fine, but I can't open anything in openoffice directly, ouch.&lt;/li&gt;&lt;li&gt;Firefox locked up and crashed many times.&lt;/li&gt;&lt;li&gt;Wireless configuration is painful for a roaming laptop.&lt;/li&gt;&lt;li&gt;Dual monitors are a must but getting xorg to work with both, good luck.
&lt;/li&gt;&lt;/ul&gt;The more I tried to do the harder it got and the more buggy.  Will Linux ever be stable enough or be able to exist in a Windows network, not for a while.

*UPDATE:
I have switched to Ubuntu and gnome, much better experience, I don't care what Linus says LOL.

Anyway, there are still a lot of bugs.  What will make it better:
-Better and faster drivers from hardware vendors
-More OSS developers to help with apps so they are tested and stable before release
-Corporate support, money talks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-117071286592430704?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/117071286592430704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=117071286592430704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/117071286592430704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/117071286592430704'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/02/linux-still-not-good-desktop.html' title='Linux still not a good desktop'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116867092487326912</id><published>2007-01-12T22:48:00.000-08:00</published><updated>2007-01-12T22:48:44.923-08:00</updated><title type='text'>Asterisk 1.4</title><content type='html'>With asterisk 1.4 finally out of beta I figured I would give it a whirl.  They have now stepped up to the "distro" market to compete with trixbox and probably do a better job.

You do have to register on the asterisk site to download it but oh well.  The wizard is easy to use and the asterisk web GUI is very very nice.  Things that are missing is voicemail, call recording, a reception module and phone provisioning.  Hopefully I can get that intergrated sooner rather then later.

Trixbox is still using an old version of asterisk 1.2.13 I think.  That is not going to work with the amount of changes that have been done for 1.4.0.  Trixbox just doesn't make things much easier if you know what you are doing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116867092487326912?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116867092487326912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116867092487326912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116867092487326912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116867092487326912'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/01/asterisk-14.html' title='Asterisk 1.4'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116835527630117074</id><published>2007-01-09T07:07:00.000-08:00</published><updated>2007-01-09T07:07:56.863-08:00</updated><title type='text'>Windows Home Server will live in your closet, simplify your life | Jesse D. Lewin | Microsoft 10</title><content type='html'>Check out the new windows home server.  This will finally will make having multiple computers at home convenient.  Check out the backup feature, that alone makes it worth it.  M$ is doing things right for once.

&lt;a href="http://www.on10.net/Blogs/jesse/windows-home-server-will-live-in-your-closet-simplify-your-life/"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116835527630117074?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116835527630117074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116835527630117074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116835527630117074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116835527630117074'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2007/01/windows-home-server-will-live-in-your.html' title='Windows Home Server will live in your closet, simplify your life | Jesse D. Lewin | Microsoft 10'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116698653343825705</id><published>2006-12-24T10:55:00.000-08:00</published><updated>2006-12-25T01:41:44.573-08:00</updated><title type='text'>Video Editing and Jump Cut</title><content type='html'>I saw this new site/service on techtv looks pretty sweet, it is called &lt;a href="http://www.jumpcut.com/"&gt;Jumpcut&lt;/a&gt;.  I will be trying it out over the next while and post how it is.

Over the years I have made a few highlight tapes for people I play football with and have coached.  This on is of my brother from 2002.  I usually use Ulead Media Studio pro, it makes it really easy.&lt;table xmlns="http://purl.org/atom/ns#" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td colspan="2"&gt;&lt;embed flashvars="" id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docId=-1902354467777250892&amp;amp;hl=en-CA" style="width:400px; height:326px;" type="application/x-shockwave-flash"&gt; &lt;/embed&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr/&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116698653343825705?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116698653343825705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116698653343825705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116698653343825705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116698653343825705'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/video-editing-and-jump-cut.html' title='Video Editing and Jump Cut'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116679895310294078</id><published>2006-12-22T06:45:00.000-08:00</published><updated>2006-12-23T13:50:15.590-08:00</updated><title type='text'>Terrible Terry Tate</title><content type='html'>What every company needs as their COO.

Some quotes:
&lt;ul&gt;&lt;li&gt;You can't come into my kitchen, kick my do, and take a box full of ballpoints.
Your ass must be crazy.&lt;/li&gt;&lt;li&gt;You can't come tippy toe'n up in this hump bumpy&lt;/li&gt;&lt;li&gt;The only pain I got time for is the pain I inflict on fools that don't know what time it is&lt;/li&gt;&lt;li&gt;Check Razer, check razer, its the pain train, the pain train is coming
WOOO WOOO, WOOO WOOO&lt;/li&gt;&lt;/ul&gt;
&lt;object height="350" width="425" data="http://www.youtube.com/v/4q4jb-kXebQ"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4q4jb-kXebQ"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/object&gt;
&lt;object height="350" width="425" data="http://www.youtube.com/v/CtJOzE1GJWw"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CtJOzE1GJWw"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/object&gt;
&lt;object height="350" width="425" data="http://www.youtube.com/v/IdoNoDETYnw"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IdoNoDETYnw"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/object&gt;
&lt;object height="350" width="425" data="http://www.youtube.com/v/6EHhwxRls2Y"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6EHhwxRls2Y"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/object&gt;
&lt;object height="350" width="425" data="http://www.youtube.com/v/g91wjVxVn5E"&gt;&lt;param name="movie" value="http://www.youtube.com/v/g91wjVxVn5E"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116679895310294078?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116679895310294078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116679895310294078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116679895310294078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116679895310294078'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/terrible-terry-tate.html' title='Terrible Terry Tate'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116679402095034592</id><published>2006-12-22T05:10:00.000-08:00</published><updated>2007-02-10T13:41:39.996-08:00</updated><title type='text'>Adding digg to blogger</title><content type='html'>So I wanted to add the dig buttons you see around to my blog, not that anyone is going to even read mine but I though I would add it anyway.  I found this &lt;a href="http://diggbutton.blogspot.com/2006/09/add-digg-button-to-single-blogger-post.html"&gt;post   &lt;/a&gt; which pretty much says to make an html file with only this &lt;a href="http://www.digg.com/tools/count"&gt;javascript&lt;/a&gt; and add it as an iframe.  I looked at the source of the javascript and all it does is add and iframe so why would you add and iframe of an iframe?

The other stupid thing is digg requires you to input the url of the digg story not the url of what you are digging.  This makes it a pain in the ass and requires you to digg the story or the button wont even show up, you just get an error.

The reddit button is makes much more sense and the url is the url of the story so you can easily add it to your blogger template like so.
&lt;div style="font-family: courier;"&gt;
&amp;lt;script&gt;reddit_url='&lt;$BlogItemPermalinkURL$&gt;'&amp;lt;/script&amp;gt;
&amp;lt;script language="javascript" src="http://reddit.com/button.js?t=1"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/div&gt;
The digg buttons I add to the blog post not the template like this:
&lt;div style="font-family: courier;"&gt;
&amp;lt;iframe src="http://digg.com/api/diggthis.php?u=[digurl]"
 frameborder="0" height="82" scrolling="no" width="55"&amp;gt;&amp;lt;/iframe&amp;gt;

&lt;/div&gt;
&lt;iframe src="http://digg.com/api/diggthis.php?u=http://digg.com/programming/Adding_digg_to_blogger" frameborder="0" height="82" scrolling="no" width="55"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116679402095034592?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116679402095034592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116679402095034592' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116679402095034592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116679402095034592'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/adding-digg-to-blogger.html' title='Adding digg to blogger'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116663133323804786</id><published>2006-12-20T08:06:00.000-08:00</published><updated>2006-12-20T08:15:33.246-08:00</updated><title type='text'>Ever need a math tutor</title><content type='html'>This was just on &lt;a href="http://www.reddit.com"&gt;reddit&lt;/a&gt; nothing new but remeber Winnie from the Wonder years.  Check out her July 2005 photos from stuff &lt;a href="http://thegrumpiest.com/?p=2215"&gt;http://thegrumpiest.com/?p=2215.&lt;/a&gt;

But take a look at here wikipedia page&lt;a href="http://en.wikipedia.org/wiki/Danica_McKellar"&gt; http://en.wikipedia.org/wiki/Danica_McKellar&lt;/a&gt; she published a paper on "Percolation and Gibbs states multiplicity for ferromagnetic
Ashkin–Teller models on Z&lt;span style="font-size:85%;"&gt;2" and offers free math tutoring to her fans.

The other cool thing is her and Natalie Portman are the only two real actors with an &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Erdos-Bacon_number"&gt;&lt;b&gt;Erdős–Bacon number&lt;/b&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116663133323804786?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116663133323804786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116663133323804786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116663133323804786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116663133323804786'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/ever-need-math-tutor.html' title='Ever need a math tutor'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116663076053252079</id><published>2006-12-20T07:57:00.000-08:00</published><updated>2006-12-20T10:19:52.643-08:00</updated><title type='text'>Asterisk Developers Kit</title><content type='html'>I received a marketing email from Digium yesterday found &lt;a href="http://www.digium.com/en/products/hardware/aadk.php"&gt;here&lt;/a&gt;.  For anyone that does asterisk hacking, or uses it as a product, the &lt;a href="http://www.digium.com/en/products/hardware/aadk.php"&gt;asterisk developers ki&lt;/a&gt;t looks like a very worth while investment.

To summarize it:
&lt;ul&gt;&lt;li&gt; &lt;p&gt;An Asterisk Appliance with 64MB RAM, 8MB on board flash, 5 Ethernet ports (4 LAN, WAN), Craft (serial) port, support for 8 analog (FXS/FXO) ports, Universal power supply.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Quad FXS analog card and Quad FXO analog card&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;Multi-media add-on flash cards&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Cables for all supported port types&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Polycom (TM) IP-430 SIP Phone&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;CD with software&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Documentation and specifications&lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;How to manuals&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Access to the Digium AADK Wiki&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;And there are 3 packages:
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;AADK Professional Bundle - for the asterisk hackers
&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AADK Administrator Bundle - if you want some support and trainning
&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AADK Standard - if you are cheap&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;iframe src='http://digg.com/api/diggthis.php?u=http://www.digg.com/hardware/Asterisk_Developers_Kit' height='82' width='55' frameborder='0' scrolling='no'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116663076053252079?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116663076053252079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116663076053252079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116663076053252079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116663076053252079'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/asterisk-developers-kit.html' title='Asterisk Developers Kit'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38117766.post-116634231386967612</id><published>2006-12-16T23:55:00.000-08:00</published><updated>2006-12-20T10:16:41.686-08:00</updated><title type='text'>Wengo Phone</title><content type='html'>Wengo phone releases a flash based SIP phone.  Being the voip guy that I am figured I would try it out and see if there is any possiblity of intergrating it into &lt;a href="http://www.asterisk.org/"&gt;asterisk&lt;/a&gt; or the project that I am helping out with &lt;a href="http://sourceforge.net/projects/web-meetme/"&gt;Web MeetMe.&lt;/a&gt;

*Edit: Wengo phone requires you to be logged in on you blog with the flash app.  Logging in to the chat software does not work, booo.  Kinda cool but useless, waiting for a sip flash phone.  Did a quick google search for one but couldn't find anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38117766-116634231386967612?l=justinhamade.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://justinhamade.blogspot.com/feeds/116634231386967612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38117766&amp;postID=116634231386967612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116634231386967612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38117766/posts/default/116634231386967612'/><link rel='alternate' type='text/html' href='http://justinhamade.blogspot.com/2006/12/wengo-phone.html' title='Wengo Phone'/><author><name>Justin Hamade</name><uri>http://www.blogger.com/profile/00860018276812807157</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_2ckBoYwDqYM/SzPBDWkZQ-I/AAAAAAAALZE/KgCBxzEh_sI/s1600-R/11dfd3a77a940ac561aa9a416424342a.jpeg'/></author><thr:total>0</thr:total></entry></feed>
