User:Timothee Flutre/Notebook/Postdoc/2012/05/16
From OpenWetWare
(Difference between revisions)
m (→Typical templates for Python scripts and C++ programs: add flush in C++) |
(→Typical templates for Python scripts and C++ programs: add latex-beamer template) |
||
| Line 6: | Line 6: | ||
| colspan="2"| | | colspan="2"| | ||
<!-- ##### DO NOT edit above this line unless you know what you are doing. ##### --> | <!-- ##### DO NOT edit above this line unless you know what you are doing. ##### --> | ||
| - | ==Typical templates for Python scripts | + | ==Typical templates for Python scripts, C++ programs and others== |
| - | It is always rewarding on the long term to start any piece of computer software with a minimum amount of generic code (verbose, command-line options, help message, license, etc). But it's a pain to write all this every time, right? So below are my typical templates for any Python script | + | It is always rewarding on the long term to start any piece of computer software with a minimum amount of generic code (verbose, command-line options, help message, license, etc). But it's a pain to write all this every time, right? So below are my typical templates for any Python script, C++ programs and others. |
* '''Python''': it is assumed that the code below is copied into a file named "MyClass.py". | * '''Python''': it is assumed that the code below is copied into a file named "MyClass.py". | ||
| Line 282: | Line 282: | ||
} | } | ||
</nowiki> | </nowiki> | ||
| + | |||
| + | * '''Latex-Beamer''': it is assumed that the code below is copied into a file named "mypresentation.tex". Several packages are assumed to be already installed. The current directory is also assumed to contain a directory named "figures" in which are saved all picture files included in the presentation. | ||
| + | |||
| + | <nowiki> | ||
| + | % Author: Timothée Flutre | ||
| + | |||
| + | \documentclass{beamer} | ||
| + | \usepackage{amsmath} | ||
| + | \usepackage{bm} % to have mathematical symbols in bold | ||
| + | \usepackage{hyperref} | ||
| + | \hypersetup{colorlinks, linkcolor=black, urlcolor=gray} | ||
| + | \usepackage{multirow} | ||
| + | \usepackage{tikz} | ||
| + | \usepackage[francais]{babel} | ||
| + | \usepackage[utf8]{inputenc} | ||
| + | |||
| + | |||
| + | \graphicspath{{./figures/}} | ||
| + | |||
| + | %----------------------------------------------------------------------------- | ||
| + | |||
| + | \setbeamertemplate{caption}[numbered] | ||
| + | \setbeamerfont{caption}{size=\scriptsize} | ||
| + | \setbeamertemplate{navigation symbols}{} | ||
| + | \setbeamercolor{alerted text}{fg=purple} | ||
| + | |||
| + | \setbeamertemplate{footline} | ||
| + | { | ||
| + | \leavevmode | ||
| + | \hbox{ | ||
| + | \hspace*{-0.06cm} | ||
| + | \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot} | ||
| + | \usebeamerfont{author in head/foot}\insertshortauthor \hspace*{1em} \insertshortinstitute | ||
| + | \end{beamercolorbox} | ||
| + | \begin{beamercolorbox}[wd=.50\paperwidth,ht=2.25ex,dp=1ex,center]{section in head/foot} | ||
| + | \usebeamerfont{section in head/foot}\insertshorttitle | ||
| + | \end{beamercolorbox} | ||
| + | \begin{beamercolorbox}[wd=.27\paperwidth,ht=2.25ex,dp=1ex,right]{section in head/foot}% | ||
| + | \usebeamerfont{section in head/foot}\insertshortdate{}\hspace*{2em} | ||
| + | \insertframenumber{} / \inserttotalframenumber\hspace*{2ex} | ||
| + | \end{beamercolorbox} | ||
| + | } | ||
| + | \vskip0pt | ||
| + | } | ||
| + | |||
| + | \AtBeginSection[] | ||
| + | { | ||
| + | \begin{frame} | ||
| + | \frametitle{Outline} | ||
| + | \addtocounter{framenumber}{-1} | ||
| + | \tableofcontents[currentsection] | ||
| + | \end{frame} | ||
| + | } | ||
| + | |||
| + | %----------------------------------------------------------------------------- | ||
| + | |||
| + | \title[Short title]{Long title} | ||
| + | \author[T. Flutre]{Timoth\'{e}e Flutre} | ||
| + | \institute[Short affiliation]{Long affiliation} | ||
| + | \date{\today} | ||
| + | |||
| + | begin{document} | ||
| + | |||
| + | \begin{frame} | ||
| + | \titlepage | ||
| + | \end{frame} | ||
| + | |||
| + | \begin{frame} | ||
| + | \frametitle{Outline} | ||
| + | \tableofcontents | ||
| + | \end{frame} | ||
| + | |||
| + | \section{First section} | ||
| + | |||
| + | \begin{frame} | ||
| + | \frametitle{I.1.} | ||
| + | \begin{itemize} | ||
| + | \item | ||
| + | \end{itemize} | ||
| + | \end{frame} | ||
| + | |||
| + | \section{Second section} | ||
| + | |||
| + | \begin{frame} | ||
| + | \frametitle{II.1.} | ||
| + | \begin{center} | ||
| + | %\includegraphics[width=0.95\textwidth,height=0.90\textheight,keepaspectratio=true]{myplot}% | ||
| + | \end{center} | ||
| + | \end{frame} | ||
| + | |||
| + | end{document} | ||
| + | </nowiki> | ||
| + | |||
<!-- ##### DO NOT edit below this line unless you know what you are doing. ##### --> | <!-- ##### DO NOT edit below this line unless you know what you are doing. ##### --> | ||
Revision as of 11:44, 19 June 2012
Main project page Previous entry Next entry
| |
Typical templates for Python scripts, C++ programs and othersIt is always rewarding on the long term to start any piece of computer software with a minimum amount of generic code (verbose, command-line options, help message, license, etc). But it's a pain to write all this every time, right? So below are my typical templates for any Python script, C++ programs and others.
#!/usr/bin/env python
# Author: Timothee Flutre
# License: GPL-3
# Aim: does this and that
# help2man -o MyClass.man ./MyClass.py
# groff -mandoc MyClass.man > MyClass.ps
import sys
import os
import getopt
import time
import datetime
import math
class MyClass(object):
def __init__(self):
self.verbose = 1
self.input = ""
def help(self):
msg = "`%s' does this and that.\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "Usage: %s [OPTIONS] ...\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "Options:\n"
msg += " -h, --help\tdisplay the help and exit\n"
msg += " -V, --version\toutput version information and exit\n"
msg += " -v, --verbose\tverbosity level (0/default=1/2/3)\n"
msg += " -i\tinput"
msg += "\n"
msg += "Examples:\n"
print msg; sys.stdout.flush()
def version(self):
msg = "%s 0.1\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
msg += "This is free software; see the source for copying conditions. There is NO\n"
msg += "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
print msg; sys.stdout.flush()
def setAttributesFromCmdLine(self):
try:
opts, args = getopt.getopt( sys.argv[1:], "hVv:i:",
["help", "version", "verbose="])
except getopt.GetoptError, err:
sys.stderr.write("%s\n" % str(err))
self.help()
sys.exit(2)
for o, a in opts:
if o == "-h" or o == "--help":
self.help()
sys.exit(0)
elif o == "-V" or o == "--version":
self.version()
sys.exit(0)
elif o == "-v" or o == "--verbose":
self.verbose = int(a)
elif o == "-i":
self.input = a
else:
assert False, "unhandled option"
def checkAttributes(self):
if self.input == "":
msg = "ERROR: missing required argument -i"
sys.stderr.write("%s\n\n" % msg)
self.help()
sys.exit(1)
def run(self):
self.checkAttributes()
if self.verbose > 0:
msg = "START %s" % time.strftime("%Y-%m-%d %H:%M:%S")
startTime = time.time()
print msg; sys.stdout.flush()
# ... specific code ...
if self.verbose > 0:
msg = "END %s" % time.strftime("%Y-%m-%d %H:%M:%S")
endTime = time.time()
runLength = datetime.timedelta(seconds=
math.floor(endTime - startTime))
msg += " (%s)" % str(runLength)
print msg; sys.stdout.flush()
if __name__ == "__main__":
i = MyClass()
i.setAttributesFromCmdLine()
i.run()
/** \file myprogram.cpp
*
* `myprogram' does this and that.
* Copyright (C) 2011,2012 Timothee Flutre
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* g++ -Wall -fopenmp -O3 myprogram.cpp -lgsl -lgslcblas -o myprogram
* help2man -o .man ./myprogram
* groff -mandoc myprogram.man > myprogram.ps
*/
#include <cmath>
#include <ctime>
#include <getopt.h>
#include <iostream>
#include <string>
using namespace std;
#include "utils.cpp"
/** \brief Display the help on stdout.
*/
void help (char ** argv)
{
cout << "`" << argv[0] << "'"
<< " does this and that." << endl
<< endl
<< "Usage: " << argv[0] << " [OPTIONS] ..." << endl
<< endl
<< "Options:" << endl
<< " -h, --help\tdisplay the help and exit" << endl
<< " -V, --version\toutput version information and exit" << endl
<< " -v, --verbose\tverbosity level (0/default=1/2/3)" << endl
<< " -i, --in\tinput" << endl
<< endl
<< "Examples:" << endl
<< " " << argv[0] << " -i <input>" << endl
<< endl
<< "Remarks:" << endl
<< " This is my typical template file for C++." << endl
;
}
/** \brief Display version and license information on stdout.
*/
void version (char ** argv)
{
cout << argv[0] << " 0.1" << endl
<< endl
<< "Copyright (C) 2011,2012 T. Flutre." << endl
<< "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>" << endl
<< "This is free software; see the source for copying conditions. There is NO" << endl
<< "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." << endl
<< endl
<< "Written by T. Flutre." << endl;
}
/** \brief Parse the command-line arguments and check the values of the
* compulsory ones.
*/
void
parse_args (
int argc,
char ** argv,
string & input,
int & verbose)
{
int c = 0;
while (1)
{
static struct option long_options[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"verbose", required_argument, 0, 'v'},
{"input", required_argument, 0, 'i'},
{0, 0, 0, 0}
};
int option_index = 0;
c = getopt_long (argc, argv, "hVv:i:",
long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
if (long_options[option_index].flag != 0)
break;
case 'h':
help (argv);
exit (0);
case 'V':
version (argv);
exit (0);
case 'v':
verbose = atoi(optarg);
break;
case 'i':
input = optarg;
break;
case '?':
printf ("\n"); help (argv);
abort ();
default:
printf ("\n"); help (argv);
abort ();
}
}
if (input.empty())
{
fprintf (stderr, "ERROR: missing input (-i).\n\n");
help (argv);
exit (1);
}
if (! doesFileExist (input))
{
fprintf (stderr, "ERROR: can't find file '%s'.\n\n", input.c_str());
help (argv);
exit (1);
}
}
int main (int argc, char ** argv)
{
string input;
int verbose = 1;
parse_args (argc, argv, input, verbose);
time_t startRawTime, endRawTime;
if (verbose > 0)
{
time (&startRawTime);
cout << "START " << argv[0] << " (" << time2string (startRawTime) << ")"
<< endl << flush;
}
// ... specific code ...
if (verbose > 0)
{
time (&endRawTime);
cout << "END " << argv[0] << " (" << time2string (endRawTime)
<< ": elapsed -> " << elapsedTime(startRawTime, endRawTime)
<< ")" << endl;
}
return EXIT_SUCCESS;
}
% Author: Timothée Flutre
\documentclass{beamer}
\usepackage{amsmath}
\usepackage{bm} % to have mathematical symbols in bold
\usepackage{hyperref}
\hypersetup{colorlinks, linkcolor=black, urlcolor=gray}
\usepackage{multirow}
\usepackage{tikz}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\graphicspath{{./figures/}}
%-----------------------------------------------------------------------------
\setbeamertemplate{caption}[numbered]
\setbeamerfont{caption}{size=\scriptsize}
\setbeamertemplate{navigation symbols}{}
\setbeamercolor{alerted text}{fg=purple}
\setbeamertemplate{footline}
{
\leavevmode
\hbox{
\hspace*{-0.06cm}
\begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}
\usebeamerfont{author in head/foot}\insertshortauthor \hspace*{1em} \insertshortinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[wd=.50\paperwidth,ht=2.25ex,dp=1ex,center]{section in head/foot}
\usebeamerfont{section in head/foot}\insertshorttitle
\end{beamercolorbox}
\begin{beamercolorbox}[wd=.27\paperwidth,ht=2.25ex,dp=1ex,right]{section in head/foot}%
\usebeamerfont{section in head/foot}\insertshortdate{}\hspace*{2em}
\insertframenumber{} / \inserttotalframenumber\hspace*{2ex}
\end{beamercolorbox}
}
\vskip0pt
}
\AtBeginSection[]
{
\begin{frame}
\frametitle{Outline}
\addtocounter{framenumber}{-1}
\tableofcontents[currentsection]
\end{frame}
}
%-----------------------------------------------------------------------------
\title[Short title]{Long title}
\author[T. Flutre]{Timoth\'{e}e Flutre}
\institute[Short affiliation]{Long affiliation}
\date{\today}
begin{document}
\begin{frame}
\titlepage
\end{frame}
\begin{frame}
\frametitle{Outline}
\tableofcontents
\end{frame}
\section{First section}
\begin{frame}
\frametitle{I.1.}
\begin{itemize}
\item
\end{itemize}
\end{frame}
\section{Second section}
\begin{frame}
\frametitle{II.1.}
\begin{center}
%\includegraphics[width=0.95\textwidth,height=0.90\textheight,keepaspectratio=true]{myplot}%
\end{center}
\end{frame}
end{document}
| |



