Added slide numbers.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tutorial slides on Python.
%
% Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in>
% Copyright (c) 2005-2009, Prabhu Ramachandran
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[compress,14pt]{beamer}
% \documentclass[handout]{beamer}
% \usepackage{pgfpages}
% \pgfpagesuselayout{4 on 1}[a4paper,border, shrink=5mm,landscape]
\usepackage{tikz}
\newcommand{\hyperlinkmovie}{}
%\usepackage{movie15}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Note that in presentation mode
% \paperwidth 364.19536pt
% \paperheight 273.14662pt
% h/w = 0.888
\mode<presentation>
{
\usetheme{Warsaw}
%\usetheme{Boadilla}
%\usetheme{default}
\useoutertheme{infolines}
\setbeamercovered{transparent}
}
% To remove navigation symbols
\setbeamertemplate{navigation symbols}{}
\usepackage{amsmath}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
% Taken from Fernando's slides.
\usepackage{ae,aecompl}
\usepackage{mathpazo,courier,euler}
\usepackage[scaled=.95]{helvet}
\usepackage{pgf}
\definecolor{darkgreen}{rgb}{0,0.5,0}
\usepackage{listings}
\lstset{language=Python,
basicstyle=\ttfamily\bfseries,
commentstyle=\color{red}\itshape,
stringstyle=\color{darkgreen},
showstringspaces=false,
keywordstyle=\color{blue}\bfseries}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% My Macros
\setbeamercolor{postit}{bg=yellow,fg=black}
\setbeamercolor{emphbar}{bg=blue!20, fg=black}
\newcommand{\emphbar}[1]
{\begin{beamercolorbox}[rounded=true]{emphbar}
{#1}
\end{beamercolorbox}
}
%{\centerline{\fcolorbox{gray!50} {blue!10}{
%\begin{minipage}{0.9\linewidth}
% {#1}
%\end{minipage}
% }}}
\newcommand{\myemph}[1]{\structure{\emph{#1}}}
\newcommand{\PythonCode}[1]{\lstinline{#1}}
\newcommand{\tvtk}{\texttt{tvtk}}
\newcommand{\mlab}{\texttt{mlab}}
\newcounter{time}
\setcounter{time}{0}
\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\vspace*{0.1in}\tiny \thetime\ m}}
\newcommand\BackgroundPicture[1]{%
\setbeamertemplate{background}{%
\parbox[c][\paperheight]{\paperwidth}{%
\vfill \hfill
\hfill \vfill
}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Configuring the theme
%\setbeamercolor{normal text}{fg=white}
%\setbeamercolor{background canvas}{bg=black}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Title page
\title[]{Debugging and \\Test Driven Approach}
\author[FOSSEE] {FOSSEE}
\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
\date[] {11, October 2009}
\date[] % (optional)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\pgfdeclareimage[height=0.75cm]{iitblogo}{iitblogo}
%\logo{\pgfuseimage{iitblogo}}
\AtBeginSection[]
{
\begin{frame}<beamer>
\frametitle{Outline}
\Large
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
%% Delete this, if you do not want the table of contents to pop up at
%% the beginning of each subsection:
\AtBeginSubsection[]
{
\begin{frame}<beamer>
\frametitle{Outline}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
\AtBeginSection[]
{
\begin{frame}<beamer>
\frametitle{Outline}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DOCUMENT STARTS
\begin{document}
\begin{frame}
\maketitle
\end{frame}
\section{Debugging}
\subsection{Errors and Exceptions}
\begin{frame}[fragile]
\frametitle{Errors}
\begin{lstlisting}
>>> while True print 'Hello world'
\end{lstlisting}
\pause
\begin{lstlisting}
File "<stdin>", line 1, in ?
while True print 'Hello world'
^
SyntaxError: invalid syntax
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Exceptions}
\begin{lstlisting}
>>> print spam
\end{lstlisting}
\pause
\begin{lstlisting}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Exceptions}
\begin{lstlisting}
>>> 1 / 0
\end{lstlisting}
\pause
\begin{lstlisting}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division
or modulo by zero
\end{lstlisting}
\end{frame}
\subsection{Strategy}
\begin{frame}[fragile]
\frametitle{Debugging effectively}
\begin{itemize}
\item \kwrd{print} based strategy
\item Process:
\end{itemize}
\begin{center}
\pgfimage[interpolate=true,width=5cm,height=5cm]{DebugginDiagram.png}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{Debugging effectively}
\begin{itemize}
\item Using \typ{\%debug} in IPython
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Debugging in IPython}
\small
\begin{lstlisting}
In [1]: import mymodule
In [2]: mymodule.test()
---------------------------------------------
NameError Traceback (most recent call last)
<ipython console> in <module>()
mymodule.py in test()
1 def test():
----> 2 print spam
NameError: global name 'spam' is not defined
In [3]: %debug
> mymodule.py(2)test()
0 print spam
ipdb>
\end{lstlisting}
\inctime{15}
\end{frame}
\subsection{Exercise}
\begin{frame}[fragile]
\frametitle{Debugging: Exercise}
\small
\begin{lstlisting}
import keyword
f = open('/path/to/file')
freq = {}
for line in f:
words = line.split()
for word in words:
key = word.strip(',.!;?()[]: ')
if keyword.iskeyword(key):
value = freq[key]
freq[key] = value + 1
print freq
\end{lstlisting}
\inctime{10}
\end{frame}
%% \begin{frame}
%% \frametitle{Testing}
%% \begin{itemize}
%% \item Writing tests is really simple!
%% \item Using nose.
%% \item Example!
%% \end{itemize}
%% \end{frame}
\section{Test Driven Approach}
\begin{frame}
\frametitle{Need of Testing!}
\begin{itemize}
\item Quality
\item Regression
\item Documentation
\end{itemize}
%% \vspace*{0.25in}
%% \emphbar{It is to assure that section of code is working as it is supposed to work}
\end{frame}
\begin{frame}[fragile]
\frametitle{Example}
\begin{block}{Problem Statement}
Write a function to check whether a given input
string is a palindrome.
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Function: palindrome.py}
\begin{lstlisting}
def is_palindrome(input_str):
return input_str == input_str[::-1]
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Test for the palindrome: palindrome.py}
\begin{lstlisting}
from plaindrome import is_palindrome
def test_function_normal_words():
input = "noon"
assert is_palindrome(input) == True
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Running the tests.}
\begin{lstlisting}
$ nosetests test.py
.
----------------------------------------------
Ran 1 test in 0.001s
OK
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Exercise: Including new tests.}
\begin{lstlisting}
def test_function_ignore_cases_words():
input = "Noon"
assert is_palindrome(input) == True
\end{lstlisting}
\vspace*{0.25in}
Check\\
\PythonCode{$ nosetests test.py} \\
\begin{block}{Task}
Tweak the code to pass this test.
\end{block}
\end{frame}
%\begin{frame}[fragile]
% \frametitle{Lets write some test!}
%\begin{lstlisting}
%#for form of equation y=mx+c
%#given m and c for two equation,
%#finding the intersection point.
%def intersect(m1,c1,m2,c2):
% x = (c2-c1)/(m1-m2)
% y = m1*x+c1
% return (x,y)
%\end{lstlisting}
%
%Create a simple test for this
%
%function which will make it fail.
%
%\inctime{15}
%\end{frame}
%
\begin{frame}[fragile]
\frametitle{Exercise}
Based on Euclid's algorithm:
\begin{center}
$gcd(a,b)=gcd(b,b\%a)$
\end{center}
gcd function can be written as:
\begin{lstlisting}
def gcd(a, b):
if a%b == 0: return b
return gcd(b, a%b)
\end{lstlisting}
\vspace*{-0.15in}
\begin{block}{Task}
\begin{itemize}
\item Write at least
two tests for above mentioned function.
\item Write a non recursive implementation
of gcd(), and test it using already
written tests.
\end{itemize}
\end{block}
\inctime{15}
\end{frame}
\begin{frame}
\frametitle{We have learned}
\begin{itemize}
\item Following and Resolving Error Messages.
\item Exceptions.
\item Approach for Debugging.
\item Writting and running tests.
\end{itemize}
\end{frame}
\end{document}