# HG changeset patch # User Shantanu # Date 1256720103 -19800 # Node ID f6725f6bee41561cf0b8ecb9a42f05853ee26388 # Parent 0aa2964438c6d05a3c02fd75246db65522d81c77 Session 4, Debugging and Testing. diff -r 0aa2964438c6 -r f6725f6bee41 day1/data/filter.png Binary file day1/data/filter.png has changed diff -r 0aa2964438c6 -r f6725f6bee41 day2/DebugginDiagram.png Binary file day2/DebugginDiagram.png has changed diff -r 0aa2964438c6 -r f6725f6bee41 day2/session3.tex --- a/day2/session3.tex Wed Oct 28 13:06:58 2009 +0530 +++ b/day2/session3.tex Wed Oct 28 14:25:03 2009 +0530 @@ -238,7 +238,7 @@ \frametitle{Using mlab} \begin{lstlisting} ->>> from enthought.mayavi import mlab +In []: from enthought.mayavi import mlab \end{lstlisting} \vspace*{0.5in} @@ -248,9 +248,9 @@ \vspace*{0.25in} \begin{lstlisting} ->>> mlab.test_ ->>> mlab.test_contour3d() ->>> mlab.test_contour3d?? +In []: mlab.test_ +In []: mlab.test_contour3d() +in []: mlab.test_contour3d?? \end{lstlisting} \end{frame} @@ -279,12 +279,12 @@ \end{columns} \begin{lstlisting} ->>> from numpy import * ->>> t = linspace(0, 2*pi, 50) ->>> u = cos(t)*pi ->>> x, y, z = sin(u), cos(u), sin(t) +In []: from numpy import * +In []: t = linspace(0, 2*pi, 50) +In []: u = cos(t) * pi +in []: x, y, z = sin(u), cos(u), sin(t) \end{lstlisting} - \emphbar{\PythonCode{>>> mlab.points3d(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.points3d(x, y, z)}} \end{frame} \begin{frame} @@ -294,7 +294,7 @@ \column{0.5\textwidth} \pgfimage[width=2.5in]{MEDIA/m2/mlab/plot3d_ex} \end{columns} - \emphbar{\PythonCode{>>> mlab.plot3d(x, y, z, t)}} + \emphbar{\PythonCode{In []: mlab.plot3d(x, y, z, t)}} Plots lines between the points @@ -308,11 +308,11 @@ \pgfimage[width=2in]{MEDIA/m2/mlab/surf_ex} \end{columns} \begin{lstlisting} ->>> x, y = mgrid[-3:3:100j,-3:3:100j] ->>> z = sin(x*x + y*y) +In []: x, y = mgrid[-3:3:100j,-3:3:100j] +In []: z = sin(x*x + y*y) \end{lstlisting} - \emphbar{\PythonCode{>>> mlab.surf(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.surf(x, y, z)}} \alert{Assumes the points are rectilinear} @@ -322,18 +322,18 @@ \myemph{\Large 2D data: \texttt{mlab.mesh}} \vspace*{0.25in} - \emphbar{\PythonCode{>>> mlab.mesh(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.mesh(x, y, z)}} \alert{Points needn't be regular} \vspace*{0.25in} \begin{lstlisting} ->>> phi, theta = numpy.mgrid[0:pi:20j, +In []: phi, theta = numpy.mgrid[0:pi:20j, ... 0:2*pi:20j] ->>> x = sin(phi)*cos(theta) ->>> y = sin(phi)*sin(theta) ->>> z = cos(phi) ->>> mlab.mesh(x, y, z, +In []: x = sin(phi)*cos(theta) +In []: y = sin(phi)*sin(theta) +In []: z = cos(phi) +In []: mlab.mesh(x, y, z, ... representation= ... 'wireframe') \end{lstlisting} @@ -349,10 +349,10 @@ \pgfimage[width=1.5in]{MEDIA/m2/mlab/contour3d}\\ \end{columns} \begin{lstlisting} ->>> x, y, z = ogrid[-5:5:64j, +In []: x, y, z = ogrid[-5:5:64j, ... -5:5:64j, ... -5:5:64j] ->>> mlab.contour3d(x*x*0.5 + y*y + +In []: mlab.contour3d(x*x*0.5 + y*y + z*z*2) \end{lstlisting} \end{frame} @@ -365,7 +365,7 @@ \pgfimage[width=2in]{MEDIA/m2/mlab/quiver3d_ex}\\ \begin{lstlisting} ->>> mlab.test_quiver3d() +In []: mlab.test_quiver3d() \end{lstlisting} \emphbar{\PythonCode{obj = mlab.quiver3d(x, y, z, u, v, w)}} @@ -511,6 +511,13 @@ \end{lstlisting} \end{frame} + +\begin{frame} + \begin{center} + \Huge + Thank you! + \end{center} +\end{frame} \end{document} diff -r 0aa2964438c6 -r f6725f6bee41 day2/session4.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/day2/session4.tex Wed Oct 28 14:25:03 2009 +0530 @@ -0,0 +1,374 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Tutorial slides on Python. +% +% Author: Prabhu Ramachandran +% 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 +{ + \usetheme{Warsaw} + %\usetheme{Boadilla} + %\usetheme{default} + \useoutertheme{split} + \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[]{Test Driven Approach} + +\author[FOSSEE Team] {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} + \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} + \frametitle{Outline} + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +\AtBeginSection[] +{ + \begin{frame} + \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 "", 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 "", line 1, in +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 "", line 1, in +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} +\pgfimage[interpolate=true,width=5cm,height=5cm]{DebugginDiagram.png} +\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) + in () +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} + +\end{document} diff -r 0aa2964438c6 -r f6725f6bee41 day2/session5.tex --- a/day2/session5.tex Wed Oct 28 13:06:58 2009 +0530 +++ b/day2/session5.tex Wed Oct 28 14:25:03 2009 +0530 @@ -147,14 +147,14 @@ \begin{frame}[fragile] \frametitle{Problem set 4} - Finite difference + Central difference \begin{equation*} - \frac{sin(x+h)-sin(x)}{h} + \frac{sin(x+h)-sin(x-h)}{2h} \end{equation*} \begin{lstlisting} - >>> x = linspace(0,2*pi,100) - >>> y = sin(x) - >>> deltax = x[1] - x[0] + In []: x = linspace(0, 2*pi, 100) + In []: y = sin(x) + In []: deltax = x[1] - x[0] \end{lstlisting} \pause \begin{enumerate}