User:Timothee Flutre/Notebook/Postdoc/2012/05/16: Difference between revisions
From OpenWetWare
(→Typical templates for Python scripts, C++ programs and others: update C++ template) |
|||
(8 intermediate revisions by the same user not shown) | |||
Line 26: | Line 26: | ||
# Aim: does this and that | # Aim: does this and that | ||
# choose between: | # choose between: | ||
# Author: Timothee Flutre | |||
# Not copyrighted -- provided to the public domain | # Not copyrighted -- provided to the public domain | ||
# or: | # or: | ||
Line 55: | Line 56: | ||
msg += " -V, --version\toutput version information and exit\n" | msg += " -V, --version\toutput version information and exit\n" | ||
msg += " -v, --verbose\tverbosity level (0/default=1/2/3)\n" | msg += " -v, --verbose\tverbosity level (0/default=1/2/3)\n" | ||
msg += " -i\tinput" | msg += " -i\tinput\n" | ||
msg += "\n" | msg += "\n" | ||
msg += "Examples:\n" | msg += "Examples:\n" | ||
Line 63: | Line 64: | ||
def version(self): | def version(self): | ||
msg = "%s 1.0\n" % os.path.basename(sys.argv[0]) | msg = "%s 1.0\n" % os.path.basename(sys.argv[0]) | ||
msg += "\n" | |||
msg += "Written by Timothee Flutre.\n" | |||
msg += "\n" | msg += "\n" | ||
# choose between: | # choose between: | ||
Line 71: | Line 74: | ||
msg += "This is free software; see the source for copying conditions. There is NO\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" | msg += "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" | ||
print msg; sys.stdout.flush() | print msg; sys.stdout.flush() | ||
Line 116: | Line 117: | ||
if self.verbose > 0: | if self.verbose > 0: | ||
startTime = time.time() | |||
msg = "START %s %s" % (os.path.basename(sys.argv[0]), | msg = "START %s %s" % (os.path.basename(sys.argv[0]), | ||
time.strftime("%Y-%m-%d %H:%M:%S")) | time.strftime("%Y-%m-%d %H:%M:%S")) | ||
msg += "\ncmd-line: %s" % ' '.join(sys.argv) | |||
print msg; sys.stdout.flush() | print msg; sys.stdout.flush() | ||
Line 172: | Line 174: | ||
#include "utils.h" | #include "utils.h" | ||
#ifndef VERSION | |||
#define VERSION "1.0" | |||
#endif | |||
/** \brief Display the help on stdout. | /** \brief Display the help on stdout. | ||
Line 186: | Line 192: | ||
<< " -V, --version\toutput version information and exit" << endl | << " -V, --version\toutput version information and exit" << endl | ||
<< " -v, --verbose\tverbosity level (0/default=1/2/3)" << endl | << " -v, --verbose\tverbosity level (0/default=1/2/3)" << endl | ||
<< " | << " --in\tinput" << endl | ||
<< endl | << endl | ||
<< "Examples:" << endl | << "Examples:" << endl | ||
<< " " << argv[0] << " - | << " " << argv[0] << " --in <input>" << endl | ||
<< endl | << endl | ||
<< "Remarks:" << endl | << "Remarks:" << endl | ||
Line 200: | Line 206: | ||
void version (char ** argv) | void version (char ** argv) | ||
{ | { | ||
cout << argv[0] << " | cout << argv[0] << " " << VERSION << endl | ||
<< endl | << endl | ||
<< "Copyright (C) 2011-2013 Timothee Flutre." << endl | << "Copyright (C) 2011-2013 Timothee Flutre." << endl | ||
Line 228: | Line 234: | ||
{"version", no_argument, 0, 'V'}, | {"version", no_argument, 0, 'V'}, | ||
{"verbose", required_argument, 0, 'v'}, | {"verbose", required_argument, 0, 'v'}, | ||
{" | {"in", required_argument, 0, 0}, | ||
{0, 0, 0, 0} | {0, 0, 0, 0} | ||
}; | }; | ||
int option_index = 0; | int option_index = 0; | ||
c = getopt_long (argc, argv, "hVv | c = getopt_long (argc, argv, "hVv:", | ||
long_options, &option_index); | long_options, &option_index); | ||
if (c == -1) | if (c == -1) | ||
Line 241: | Line 247: | ||
if (long_options[option_index].flag != 0) | if (long_options[option_index].flag != 0) | ||
break; | break; | ||
if (strcmp(long_options[option_index].name, "in") == 0) | |||
{ | |||
input = optarg; | |||
break; | |||
} | |||
case 'h': | case 'h': | ||
help (argv); | help (argv); | ||
Line 263: | Line 274: | ||
if (input.empty()) | if (input.empty()) | ||
{ | { | ||
getCmdLine (argc, argv); | |||
fprintf (stderr, "ERROR: missing compulsory option - | fprintf (stderr, "ERROR: missing compulsory option --in\n\n"); | ||
help (argv); | help (argv); | ||
exit (1); | exit (1); | ||
Line 270: | Line 281: | ||
if (! doesFileExist (input)) | if (! doesFileExist (input)) | ||
{ | { | ||
getCmdLine (argc, argv); | |||
fprintf (stderr, "ERROR: can't find '%s'\n\n", input.c_str()); | fprintf (stderr, "ERROR: can't find '%s'\n\n", input.c_str()); | ||
help (argv); | help (argv); | ||
Line 288: | Line 299: | ||
{ | { | ||
time (&startRawTime); | time (&startRawTime); | ||
cout << "START " << argv[0] << " | cout << "START " << basename(argv[0]) | ||
<< " " << getDateTime (startRawTime) << endl | |||
<< "version " << VERSION << " compiled " << __DATE__ | |||
<< | << " " << __TIME__ << endl | ||
<< "cmd-line: " << getCmdLine (argc, argv) << endl | |||
<< "cwd: " << getCurrentDirectory() << endl; | |||
cout << flush; | |||
} | } | ||
Line 300: | Line 313: | ||
{ | { | ||
time (&endRawTime); | time (&endRawTime); | ||
cout << "END " << argv[0] << " | cout << "END " << basename(argv[0]) | ||
<< " " << getDateTime (endRawTime) << endl | |||
<< "elapsed -> " << | << "elapsed -> " << getElapsedTime(startRawTime, endRawTime) << endl | ||
<< "max.mem -> " << getMaxMemUsedByProcess2Str () << endl; | |||
<< "max.mem -> " << | |||
} | } | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</nowiki> | |||
* '''R''': | |||
<nowiki> | |||
#!/usr/bin/env Rscript | |||
# Aim: does this and that | |||
# choose between: | |||
# Author: Timothee Flutre | |||
# Not copyrighted -- provided to the public domain | |||
# or: | |||
# Copyright (C) 2011-2013 Timothee Flutre | |||
# License: GPLv3+ | |||
rm(list=ls()) | |||
prog.name <- "myscript.R" | |||
help <- function(){ | |||
txt <- paste0("`", prog.name, "' does this and that.\n") | |||
txt <- paste0(txt, "\nUsage: ", prog.name, " [OPTIONS] ...\n") | |||
txt <- paste0(txt, "\nOptions:\n") | |||
txt <- paste0(txt, " -h, --help\tdisplay the help and exit\n") | |||
txt <- paste0(txt, " -V, --version\toutput version information and exit\n") | |||
txt <- paste0(txt, " -v, --verbose\tverbosity level (0/default=1/2/3)\n") | |||
txt <- paste0(txt, " -i\t\tinput\n") | |||
message(txt) | |||
} | |||
version <- function(){ | |||
txt <- paste0(prog.name, " 1.0\n") | |||
txt <- paste0(txt, "\n") | |||
txt <- paste0(txt, "Written by Timothee Flutre.\n") | |||
txt <- paste0(txt, "\n") | |||
# choose between: | |||
txt <- paste0(txt, "Not copyrighted -- provided to the public domain\n") | |||
# or: | |||
txt <- paste0(txt, "Copyright (C) 2011-2013 Timothee Flutre.\n") | |||
txt <- paste0(txt, "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n") | |||
txt <- paste0(txt, "This is free software; see the source for copying conditions. There is NO\n") | |||
txt <- paste0(txt, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n") | |||
message(txt) | |||
} | |||
parseArgs <- function(params){ | |||
args <- commandArgs(trailingOnly=TRUE) | |||
## print(args) | |||
i <- 0 | |||
while(i < length(args)){ # use "while" loop for options with no argument | |||
i <- i + 1 | |||
if(args[i] == "-h" || args[i] == "--help"){ | |||
help() | |||
quit("no", status=0) | |||
} | |||
else if(args[i] == "-V" || args[i] == "--version"){ | |||
version() | |||
quit("no", status=0) | |||
} | |||
else if(args[i] == "-v" || args[i] == "--verbose"){ | |||
params$verbose <- as.numeric(args[i+1]) | |||
i <- i + 1 | |||
} | |||
else if(args[i] == "-i"){ | |||
params$in.file <- args[i+1] | |||
i <- i + 1 | |||
} | |||
else | |||
stop(paste0("unknown option ", args[i])) | |||
} | |||
if(params$verbose > 0){ | |||
message("parameters:") | |||
print(params) | |||
} | |||
return(params) | |||
} | |||
checkParams <- function(params){ | |||
stopifnot(! is.null(params$input), | |||
file.exists(params$input)) | |||
} | |||
main <- function(){ | |||
params <- list(verbose=1, | |||
input=NULL) | |||
params <- parseArgs(params) | |||
checkParams(params) | |||
if(params$verbose > 0) | |||
message(paste0("START ", prog.name, " (", date(), ")")) | |||
## ... specific code ... | |||
if(params$verbose > 0) | |||
message(paste0("END ", prog.name, " (", date(), ")")) | |||
} | |||
system.time(main()) | |||
print(object.size(x=lapply(ls(), get)), units="Kb") | |||
</nowiki> | </nowiki> | ||
Line 319: | Line 430: | ||
# Aim: does this and that | # Aim: does this and that | ||
# choose between: | # choose between: | ||
# Author: Timothee Flutre | |||
# Not copyrighted -- provided to the public domain | # Not copyrighted -- provided to the public domain | ||
# or: | # or: | ||
Line 336: | Line 448: | ||
msg+="\n" | msg+="\n" | ||
msg+="Examples:\n" | msg+="Examples:\n" | ||
msg+=" $0 -i <input>\n" | msg+=" ${0##*/} -i <input>\n" | ||
echo -e "$msg" | echo -e "$msg" | ||
} | } | ||
Line 342: | Line 454: | ||
function version () { | function version () { | ||
msg="${0##*/} 1.0\n" | msg="${0##*/} 1.0\n" | ||
msg+="\n" | |||
msg+="Written by Timothee Flutre.\n" | |||
msg+="\n" | msg+="\n" | ||
# choose between: | # choose between: | ||
Line 350: | Line 464: | ||
msg+="This is free software; see the source for copying conditions. There is NO\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" | msg+="warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" | ||
echo -e "$msg" | echo -e "$msg" | ||
} | } | ||
# | # http://www.linuxjournal.com/content/use-date-command-measure-elapsed-time | ||
function timer () { | function timer () { | ||
if [[ $# -eq 0 ]]; then | if [[ $# -eq 0 ]]; then | ||
echo $(date '+%s') | echo $(date '+%s') | ||
else | else | ||
local | local startRawTime=$1 | ||
endRawTime=$(date '+%s') | |||
if [[ -z "$ | if [[ -z "$startRawTime" ]]; then startRawTime=$endRawTime; fi | ||
elapsed=$((endRawTime - startRawTime)) # in sec | |||
nbDays=$((elapsed / 86400)) | |||
nbHours=$(((elapsed / 3600) % 24)) | |||
nbMins=$(((elapsed / 60) % 60)) | |||
printf | nbSecs=$((elapsed % 60)) | ||
printf "%01dd %01dh %01dm %01ds" $nbDays $nbHours $nbMins $nbSecs | |||
fi | fi | ||
} | } | ||
Line 387: | Line 500: | ||
done | done | ||
if [ -z "${input}" ]; then | if [ -z "${input}" ]; then | ||
echo "ERROR: missing compulsory option -i" | echo -e "ERROR: missing compulsory option -i\n" | ||
help | |||
exit 1 | |||
fi | fi | ||
if [ ! -f ${input} ]; then | if [ ! -f "${input}" ]; then | ||
echo "ERROR: can't find '${input}'" | echo -e "ERROR: can't find '${input}'\n" | ||
help | |||
exit 1 | |||
fi | fi | ||
} | } | ||
Line 399: | Line 516: | ||
if [ $verbose -gt "0" ]; then | if [ $verbose -gt "0" ]; then | ||
startTime=$(timer) | startTime=$(timer) | ||
msg="START ${0##*/} $(date +"%Y-%m-%d") $(date +"%H:%M:%S")" | |||
msg+="\ncmd-line: $0 "$@ # comment if an option takes a glob as argument | |||
echo -e $msg | |||
fi | fi | ||
Line 406: | Line 525: | ||
if [ $verbose -gt "0" ]; then | if [ $verbose -gt "0" ]; then | ||
msg="END ${0##*/} $(date +"%Y-%m-%d") $(date +"%H:%M:%S")" | |||
msg+=" ($(timer startTime))" | |||
echo $msg | |||
fi | fi | ||
</nowiki> | </nowiki> |
Revision as of 13:31, 20 March 2013
Project name | <html><img src="/images/9/94/Report.png" border="0" /></html> Main project page <html><img src="/images/c/c3/Resultset_previous.png" border="0" /></html>Previous entry<html> </html>Next entry<html><img src="/images/5/5c/Resultset_next.png" border="0" /></html> |
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++ program, Beamer presentation, Bash script, etc.
help2man -o myprogram.man ./myprogram man ./myprogram.man groff -mandoc myprogram.man > myprogram.ps ps2pdf myprogram.ps myprogram.pdf
#!/usr/bin/env python # Aim: does this and that # choose between: # Author: Timothee Flutre # Not copyrighted -- provided to the public domain # or: # Copyright (C) 2011-2013 Timothee Flutre # License: GPLv3+ 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\n" msg += "\n" msg += "Examples:\n" print msg; sys.stdout.flush() def version(self): msg = "%s 1.0\n" % os.path.basename(sys.argv[0]) msg += "\n" msg += "Written by Timothee Flutre.\n" msg += "\n" # choose between: msg += "Not copyrighted -- provided to the public domain\n" # or: msg += "Copyright (C) 2011-2013 Timothee Flutre.\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 compulsory option -i" sys.stderr.write("%s\n\n" % msg) self.help() sys.exit(1) if not os.path.exists(self.input): msg = "ERROR: can't find '%s'" % self.input sys.stderr.write("%s\n\n" % msg) self.help() sys.exit(1) def run(self): self.checkAttributes() if self.verbose > 0: startTime = time.time() msg = "START %s %s" % (os.path.basename(sys.argv[0]), time.strftime("%Y-%m-%d %H:%M:%S")) msg += "\ncmd-line: %s" % ' '.join(sys.argv) print msg; sys.stdout.flush() # ... specific code ... if self.verbose > 0: msg = "END %s %s" % (os.path.basename(sys.argv[0]), 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-2013 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 -g utils.cpp myprogram.cpp -lgsl -lgslcblas -lz -o myprogram */ #include <cmath> #include <ctime> #include <getopt.h> #include <iostream> #include <string> using namespace std; #include "utils.h" #ifndef VERSION #define VERSION "1.0" #endif /** \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 << " --in\tinput" << endl << endl << "Examples:" << endl << " " << argv[0] << " --in <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] << " " << VERSION << endl << endl << "Copyright (C) 2011-2013 Timothee 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 Timothee Flutre." << endl; } /** \brief Parse the command-line arguments and check the values of the * compulsory ones. */ void parseArgs ( int argc, char ** argv, string & input, int & verbose) { int c = 0; while (true) { static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"verbose", required_argument, 0, 'v'}, {"in", required_argument, 0, 0}, {0, 0, 0, 0} }; int option_index = 0; c = getopt_long (argc, argv, "hVv:", long_options, &option_index); if (c == -1) break; switch (c) { case 0: if (long_options[option_index].flag != 0) break; if (strcmp(long_options[option_index].name, "in") == 0) { input = optarg; 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()) { getCmdLine (argc, argv); fprintf (stderr, "ERROR: missing compulsory option --in\n\n"); help (argv); exit (1); } if (! doesFileExist (input)) { getCmdLine (argc, argv); fprintf (stderr, "ERROR: can't find '%s'\n\n", input.c_str()); help (argv); exit (1); } } int main (int argc, char ** argv) { string input; int verbose = 1; parseArgs (argc, argv, input, verbose); time_t startRawTime, endRawTime; if (verbose > 0) { time (&startRawTime); cout << "START " << basename(argv[0]) << " " << getDateTime (startRawTime) << endl << "version " << VERSION << " compiled " << __DATE__ << " " << __TIME__ << endl << "cmd-line: " << getCmdLine (argc, argv) << endl << "cwd: " << getCurrentDirectory() << endl; cout << flush; } // ... specific code ... if (verbose > 0) { time (&endRawTime); cout << "END " << basename(argv[0]) << " " << getDateTime (endRawTime) << endl << "elapsed -> " << getElapsedTime(startRawTime, endRawTime) << endl << "max.mem -> " << getMaxMemUsedByProcess2Str () << endl; } return EXIT_SUCCESS; }
#!/usr/bin/env Rscript # Aim: does this and that # choose between: # Author: Timothee Flutre # Not copyrighted -- provided to the public domain # or: # Copyright (C) 2011-2013 Timothee Flutre # License: GPLv3+ rm(list=ls()) prog.name <- "myscript.R" help <- function(){ txt <- paste0("`", prog.name, "' does this and that.\n") txt <- paste0(txt, "\nUsage: ", prog.name, " [OPTIONS] ...\n") txt <- paste0(txt, "\nOptions:\n") txt <- paste0(txt, " -h, --help\tdisplay the help and exit\n") txt <- paste0(txt, " -V, --version\toutput version information and exit\n") txt <- paste0(txt, " -v, --verbose\tverbosity level (0/default=1/2/3)\n") txt <- paste0(txt, " -i\t\tinput\n") message(txt) } version <- function(){ txt <- paste0(prog.name, " 1.0\n") txt <- paste0(txt, "\n") txt <- paste0(txt, "Written by Timothee Flutre.\n") txt <- paste0(txt, "\n") # choose between: txt <- paste0(txt, "Not copyrighted -- provided to the public domain\n") # or: txt <- paste0(txt, "Copyright (C) 2011-2013 Timothee Flutre.\n") txt <- paste0(txt, "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n") txt <- paste0(txt, "This is free software; see the source for copying conditions. There is NO\n") txt <- paste0(txt, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n") message(txt) } parseArgs <- function(params){ args <- commandArgs(trailingOnly=TRUE) ## print(args) i <- 0 while(i < length(args)){ # use "while" loop for options with no argument i <- i + 1 if(args[i] == "-h" || args[i] == "--help"){ help() quit("no", status=0) } else if(args[i] == "-V" || args[i] == "--version"){ version() quit("no", status=0) } else if(args[i] == "-v" || args[i] == "--verbose"){ params$verbose <- as.numeric(args[i+1]) i <- i + 1 } else if(args[i] == "-i"){ params$in.file <- args[i+1] i <- i + 1 } else stop(paste0("unknown option ", args[i])) } if(params$verbose > 0){ message("parameters:") print(params) } return(params) } checkParams <- function(params){ stopifnot(! is.null(params$input), file.exists(params$input)) } main <- function(){ params <- list(verbose=1, input=NULL) params <- parseArgs(params) checkParams(params) if(params$verbose > 0) message(paste0("START ", prog.name, " (", date(), ")")) ## ... specific code ... if(params$verbose > 0) message(paste0("END ", prog.name, " (", date(), ")")) } system.time(main()) print(object.size(x=lapply(ls(), get)), units="Kb")
#!/usr/bin/env bash # Aim: does this and that # choose between: # Author: Timothee Flutre # Not copyrighted -- provided to the public domain # or: # Copyright (C) 2011-2013 Timothee Flutre # License: GPLv3+ function help () { msg="\`${0##*/}' does this and that.\n" msg+="\n" msg+="Usage: ${0##*/} [OPTIONS] ...\n" 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, --in\tinput\n" msg+="\n" msg+="Examples:\n" msg+=" ${0##*/} -i <input>\n" echo -e "$msg" } function version () { msg="${0##*/} 1.0\n" msg+="\n" msg+="Written by Timothee Flutre.\n" msg+="\n" # choose between: msg += "Not copyrighted -- provided to the public domain\n" # or: msg+="Copyright (C) 2011-2013 Timothee Flutre.\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" echo -e "$msg" } # http://www.linuxjournal.com/content/use-date-command-measure-elapsed-time function timer () { if [[ $# -eq 0 ]]; then echo $(date '+%s') else local startRawTime=$1 endRawTime=$(date '+%s') if [[ -z "$startRawTime" ]]; then startRawTime=$endRawTime; fi elapsed=$((endRawTime - startRawTime)) # in sec nbDays=$((elapsed / 86400)) nbHours=$(((elapsed / 3600) % 24)) nbMins=$(((elapsed / 60) % 60)) nbSecs=$((elapsed % 60)) printf "%01dd %01dh %01dm %01ds" $nbDays $nbHours $nbMins $nbSecs fi } function parseArgs () { TEMP=`getopt -o hVv:i: -l help,version,verbose:,in: \ -n "$0" -- "$@"` if [ $? != 0 ] ; then echo "ERROR: getopt failed" >&2 ; exit 1 ; fi eval set -- "$TEMP" while true; do case "$1" in -h|--help) help; exit 0; shift;; -V|--version) version; exit 0; shift;; -v|--verbose) verbose=$2; shift 2;; -i|--in) input=$2; shift 2;; --) shift; break;; *) echo "ERROR: options parsing failed"; exit 1;; esac done if [ -z "${input}" ]; then echo -e "ERROR: missing compulsory option -i\n" help exit 1 fi if [ ! -f "${input}" ]; then echo -e "ERROR: can't find '${input}'\n" help exit 1 fi } verbose=1 input="" parseArgs "$@" if [ $verbose -gt "0" ]; then startTime=$(timer) msg="START ${0##*/} $(date +"%Y-%m-%d") $(date +"%H:%M:%S")" msg+="\ncmd-line: $0 "$@ # comment if an option takes a glob as argument echo -e $msg fi # ... specific code ... if [ $verbose -gt "0" ]; then msg="END ${0##*/} $(date +"%Y-%m-%d") $(date +"%H:%M:%S")" msg+=" ($(timer startTime))" echo $msg fi
% Copyright (C) 2012 Timothee 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} |