From 775dfe8072608d41f161cb6b3c5137ead08df2fd Mon Sep 17 00:00:00 2001 From: Arnaud Legrand Date: Thu, 19 Jul 2018 14:19:22 +0200 Subject: [PATCH] Initial import from github resources --- module2/ressources/emacs_orgmode.org | 236 ++++++++++++ module2/ressources/jupyter.org | 138 +++++++ .../ressources/replicable_article/Makefile | 25 ++ .../ressources/replicable_article/article.org | 263 +++++++++++++ .../ressources/replicable_article/article.pdf | Bin 0 -> 68042 bytes .../ressources/replicable_article/biblio.bib | 46 +++ .../replicable_article/measurements.txt | 100 +++++ module2/ressources/rr_org/init.el | 212 +++++++++++ module2/ressources/rr_org/init.org | 360 ++++++++++++++++++ module2/ressources/rr_org/journal.org | 96 +++++ module2/ressources/rstudio.org | 124 ++++++ 11 files changed, 1600 insertions(+) create mode 100644 module2/ressources/emacs_orgmode.org create mode 100644 module2/ressources/jupyter.org create mode 100644 module2/ressources/replicable_article/Makefile create mode 100644 module2/ressources/replicable_article/article.org create mode 100644 module2/ressources/replicable_article/article.pdf create mode 100644 module2/ressources/replicable_article/biblio.bib create mode 100644 module2/ressources/replicable_article/measurements.txt create mode 100644 module2/ressources/rr_org/init.el create mode 100644 module2/ressources/rr_org/init.org create mode 100644 module2/ressources/rr_org/journal.org create mode 100644 module2/ressources/rstudio.org diff --git a/module2/ressources/emacs_orgmode.org b/module2/ressources/emacs_orgmode.org new file mode 100644 index 0000000..596be1f --- /dev/null +++ b/module2/ressources/emacs_orgmode.org @@ -0,0 +1,236 @@ +# -*- mode: org -*- +#+TITLE: Emacs/org-mode +#+AUTHOR: Arnaud Legrand +#+DATE: June, 2018 +#+STARTUP: overview indent + +* Table of Contents :TOC: + - [[#installing-emacs-org-mode-ess-and-auctex][Installing emacs, org-mode, ess, and auctex.]] + - [[#os-specific-installation-procedure][OS-specific installation procedure]] + - [[#a-simple-reproducible-research-emacs-configuration-][A simple "/reproducible research/" emacs configuration ]] + - [[#emacs-tips-and-tricks][Emacs Tips and tricks]] + - [[#cheat-sheets][Cheat-sheets]] + - [[#video-tutorials][Video tutorials]] + - [[#additional-useful-emacs-packages][Additional useful emacs packages]] + - [[#other-resources][Other resources]] + - [[#a-replicable-article][A replicable article]] + - [[#a-stub-of-replicable-article][A stub of replicable article]] + +* Installing emacs, org-mode, ess, and auctex. +** OS-specific installation procedure +*** Linux (Debian, Ubuntu) +We provide here only instructions for debian-based distributions. Feel +free to contribute to this document to provide up-to-date information +for other distributions (e.g.n redhat, fedora). + +Today, the stable versions of the most common distributions provide +recent enough versions of emacs and org-mode: +- Debian (stretch) ships with [[https://packages.debian.org/stretch/emacs25][emacs 25.1]] and [[https://packages.debian.org/stretch/org-mode][org-mode 9.0.3]] +- Ubuntu (bionic 18.04) ships with [[https://packages.ubuntu.com/bionic/emacs25][emacs 25.2]] and [[https://packages.ubuntu.com/bionic/org-mode][org-mode 9.1.6]] +- Ubuntu (artful 17.04) ships with [[https://packages.ubuntu.com/artful/emacs25][emacs 25.2]] and [[https://packages.ubuntu.com/artful/org-mode][org-mode 9.0.9]] +If your distribution is older than this, well, it may be a good time +for upgrading... + +Simply run (as root): +#+begin_src sh :results output :exports both +apt-get update ; apt-get install emacs25 org-mode ess r-base auctex +#+end_src + +Then make sure you have a sufficiently recent version of emacs. +#+begin_src sh :results output :exports both +emacs --version 2>&1 | head -n 1 +#+end_src + +#+RESULTS: +: GNU Emacs 25.2.2 + +Likewise, you'll want to check you have a recent version of org-mode: +#+begin_src sh :results output :exports both +emacs -batch --funcall "org-version" 2>&1 | grep version +#+end_src + +#+RESULTS: +: Org mode version 9.1.11 (9.1.11-dist @ /usr/share/emacs/25.2/site-lisp/elpa/org-9.1.11/) + +The version numbers you get will depend on the distribution you are +running. _You really want to make sure you do not rely on org-mode 8_, +which is now deprecated. +*** Mac OS X +- *Option 1*: Install the =.dmg= file from [[http://vgoulet.act.ulaval.ca/][Vincent Goulet]]: + https://vigou3.github.io/emacs-modified-macos/. It ships with recent + versions: + - Emacs 26.1 + - Org-mode 9.1.13 + - ESS 17.11 + In that case you may have several versions of emacs installed on + your machine and launching emacs from a terminal may not run the one + you just installed. If anyone know how to get rid of this... +- *Option 2*: If you already use =brew=, simply do the following + #+begin_src sh :results output :exports both + brew update + brew install emacs [--with-cocoa] + brew linkapps emacs + brew tap homebrew/science + brew install ess + brew install auctex # The name may be slightly more complicated here + brew install wget + #+end_src +*** Windows +Install the =.exe= file from [[http://vgoulet.act.ulaval.ca/][Vincent Goulet]]: +https://vigou3.github.io/emacs-modified-windows/. It ships with recent +versions: +- Emacs 26.1 +- Org-mode 9.1.13 +- ESS 17.11 +** A simple "/reproducible research/" emacs configuration +Emacs comes with very basic default configuration and it appears like +everyone has its own taste. You will for example find [[https://www.emacswiki.org/emacs/StarterKits][here]] several +default Emacs configurations that reflect the preferences of their +creators. Likewise the configuration of Org-Mode is incredibly +flexible (see for example [[https://orgmode.org/worg/org-configs/index.html][the org-mode website]] for more +references). In the context of this MOOC, we propose you a relatively +minimalistic one that is rather "/reproducible research/" oriented by +adding a few org-mode specific configurations. + +*** Step 0: Backup and download our configuration +The procedure we propose will wipe your already existing custom emacs +configuration if you already have one. *You should thus beforehand make +a backup of =~/.emacs= and of =~/.emacs.d/init.el=* (if these file +exists). + +#+begin_src shell :results output :exports none +export FILE_LIST="rr_org/init.el rr_org/journal.org" +tar zcf rr_org_archive.tgz $FILE_LIST +#+end_src + +#+RESULTS: +Then download [[file:rr_org_archive.tgz][this archive]] and uncompress it. It contains the +following files and we will refer to them in the following: + +#+begin_src shell :results output :exports results +tar tzf rr_org_archive.tgz +#+end_src + +#+RESULTS: +: rr_org/init.el +: rr_org/journal.org + +*** Step 1: Prepare your journal +Create an =org/= directory in the top of your home: +#+begin_src sh :results output :exports both +mkdir -p ~/org/ +#+end_src +Then copy =rr_org/journal.org= file in your =~/org/= directory. This +file will be your laboratory notebook and all the notes you will +capture with =C-c c= will go automatically go in this file. The first +entry of this notebook is populated with [[file:rr_org/journal.org::*Org-mode][many emacs shortcuts]] that you +should give a try. +*** Step 2: Set up Emacs configuration +Copy =rr_org/init.el= in your =~/.emacs.d/= directory. + +Alternatively, if you do not want to mess with your already existing +emacs configuration, you may launch emacs with this specific +configuration with the following command: =emacs -q -l rr_org/init.el=. +*** Step 3: Check whether the installation is working or not +Open a new instance of Emacs and open a =foo.org= file. Copy the +following lines in this file: + : #+begin_src shell :session foo :results output :exports both + : ls -la + : #+end_src + +Put your cursor inside this code block and execute it with the +following command: =C-c C-c= (If you are not familiar with Emacs +commands, this one means '=Ctrl + C=' twice) + +A =#+RESULTS:= block with the result of the command should appear if it +worked. + +In the video, we already have demonstrated the main features and +shortcuts of emacs/org-mode that will help you maintain a document and +benefit from literate programming. The list of features and shortcuts +is demonstrated in the [[file:rr_org/journal.org::*Emacs%20shortcuts][first entry of your labbook]]. +*** Step 4: Open and play with your journal: +In step 1, you were told to create an journal in +=~org/journal.org=. First you probably want to make sure this file is +backed up in a revision control system like git. We leave it up to set +this up but if you have any trouble, feel free to ask on the FUN +forums. +* Emacs Tips and tricks +** Cheat-sheets +Learning emacs and org-mode can be difficult as there is an inordinate +amount of shortcuts. Many people have thus come up with +cheat-sheats. Here is a selection in case it helps: +*** Emacs +- [[file:org/journal.org::*Emacs%20shortcuts][Common and step-by-step emacs shortcuts for our /reproducible research/ configuration]] +- [[https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf][The official GNU emacs refcard]] +- Two graphical cheat-sheats by Sacha Hua on [[http://sachachua.com/blog/wp-content/uploads/2013/05/How-to-Learn-Emacs-v2-Large.png][how to learn emacs]] and on + [[http://sachachua.com/blog/wp-content/uploads/2013/08/20130830-Emacs-Newbie-How-to-Learn-Emacs-Keyboard-Shortcuts.png][how to learn emacs shortcuts]]. +*** Org-mode +- [[file:org/journal.org::*Org-mode][Common and step-by-step org-mode shortcuts for our /reproducible research/ configuration]] +- [[https://orgmode.org/worg/orgcard.html][The official org-mode refcard]] +- [[https://orgmode.org/worg/dev/org-syntax.html][The official description of the org-mode syntax]] and a [[https://gist.github.com/hoeltgman/3825415][relatively concise description of the org-mode syntax]]. +** Video tutorials +For those of you who prefer video explanations, here is a [[https://www.youtube.com/playlist?list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg][Youtube +channel with many step by step emacs tutorials]]. +** Additional useful emacs packages +*** Company-mode +[[http://company-mode.github.io/][Company-mode]] is a text completion framework for Emacs. It allows to +have smart completion in emacs for the most common languages. If you +feel this is needed, you should follow the instructions from the +official webpage: http://company-mode.github.io/ +*** Magit +[[https://magit.vc/][Magit]] is an emacs interface for Git. It is very powerfull and we use +it on a daily basis but you should definitely understand what git does +behind the scene beforehand. If you feel this would be useful for you, +you should follow the instructions from here: +https://www.emacswiki.org/emacs/Magit +** Other resources +- [[https://orgmode.org/orgguide.pdf][The compact Org-mode Guide]] +- [[https://github.com/dfeich/org-babel-examples][Many examples illustrating the use of different languages in org-mode]] +* A replicable article +** A stub of replicable article +Remember, you need a working LaTeX and R environment. If you can't +open a terminal and run the commands =R= and =pdflatex=, you will not be +able to generate this document. The article downloads the +corresponding LaTeX packages so you also need to have a working =wget= +command (alternatively, you can use =curl=). You may still read the +source ([[file:replicable_article/article.org][article.org]]) and understand how it works though. + +#+begin_src shell :results output :exports none +make -C replicable_article/ replicable_article.tgz +#+end_src + +#+RESULTS: +: make : on entre dans le répertoire « /home/alegrand/Work/Documents/Enseignements/RR_MOOC/references/module2/replicable_article » +: tar --xform "s|^|replicable_article/|" -zcf replicable_article.tgz article.org biblio.bib Makefile +: make : on quitte le répertoire « /home/alegrand/Work/Documents/Enseignements/RR_MOOC/references/module2/replicable_article » + +Download the [[file:replicable_article/replicable_article.tgz][archive]], untar it and simply make to generate the +article. You should then be able to open the [[file:replicable_article/article.pdf][resulting article]]. This +is summarized in the following command: +#+begin_src sh :results output :exports both +wget --no-check-certificate -O replicable.tgz https://github.com/alegrand/RR_webinars/raw/master/1_replicable_article_laboratory_notebook/replicable/replicable.tgz ### Fix the broken URL +tar zxf replicable.tgz; cd replicable; make ; evince article.pdf +#+end_src + +If the =make= command fails (especially on Mac), it may be because emacs +or something else is not correctly installed. In that case, open the +article directly with the following command: +#+begin_src sh :results output :exports both +emacs -q --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" article.org +#+end_src +and export it to pdf with the following shortcut: =C-c C-e l o= + +If it still doesn't work and emacs complains about not finding ESS, it +may be because you installed ESS in your home instead of +system-wide. In that case, try to remove the =-q= in the previous +command line to load your personal emacs configuration. + +Finally, when you'll be tired of always reexecuting all the source +code when exporting, just look for the following line in [[file:replicable_article/article.org][article.org]]: +#+BEGIN_EXAMPLE +# #+PROPERTY: header-args :eval never-export +#+END_EXAMPLE +If you remove the =# = in the beginning of the line, it will not be a +comment anymore and will indicate org-mode to stop evaluating every +chunk of code when exporting. diff --git a/module2/ressources/jupyter.org b/module2/ressources/jupyter.org new file mode 100644 index 0000000..ccad9b6 --- /dev/null +++ b/module2/ressources/jupyter.org @@ -0,0 +1,138 @@ +# -*- mode: org -*- +#+TITLE: Rstudio +#+AUTHOR: Arnaud Legrand +#+DATE: June, 2018 +#+STARTUP: overview indent + +* Table of Contents :TOC: + - [[#interacting-with-gitlab][Interacting with gitlab]] + - [[#additional-jupyter-resources-or-tricks][Additional Jupyter resources or tricks]] + - [[#tips-and-tricks][Tips and tricks]] + - [[#running-r-and-python-in-the-same-notebook][Running R and Python in the same notebook]] + - [[#exporting-a-notebook][Exporting a notebook]] + - [[#installing-jupyter-or-jupyter-hub-on-your-own-machine][Installing jupyter or jupyter hub on your own machine]] + - [[#installing-jupyter][Installing jupyter]] + - [[#using-r][Using R]] + - [[#exporting-your-notebooks-with-latex][Exporting your notebooks with latex]] + - [[#interacting-with-gitlab][Interacting with gitlab]] + - [[#interesting-extensions][Interesting extensions]] + - [[#installing-jupyterhub][Installing jupyterhub]] + +* Interacting with gitlab +#+BEGIN_QUOTE +This section needs some love. +#+END_QUOTE + +As you may have seen from the videos, we provide two buttons to sync +with gitlab. Indeed, even if you recover your files when you log back +into fun, the jupyter runs on a different machine than the gitlab +server and you need to commit your notebook every time you have made a +significant step. This is also the only way to really make it public +and to share your notebook with others. +* Additional Jupyter resources or tricks +** Tips and tricks +The following [[https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/][webpage]] lists several Jupyter tricks (in particular, it +illustrates many =Ipython magic= commands) that should improve your +efficiency (note that this blog post is about two years old so some of +the tricks may have been integrated in the default behavior of jupyter +now). +** Running R and Python in the same notebook +The best solution to this is to install rpy2. On my machine, I have +installed the =python3-rpy2= debian package with =apt-get install=. An +other alternative consists in going through the python package manager +with +#+begin_src python :results output :exports both +pip install rpy2 +#+end_src +Then you'll be able to use both languages in the same notebook by: +1. Loading =rpy2=: + #+begin_src python :results output :exports both + %load_ext rpy2.ipython + #+end_src +2. Using the =%R= Ipython magic: + #+begin_src python :results output :exports both + %R + summary(cars) + #+end_src + Python objects can then even be passed to R as follows (assuming df + is a pandas dataframe: + #+begin_src python :results output :exports both + %%R -i df + plot((df) + #+end_src +** Exporting a notebook +Obviously, you can convert to html or pdf using the using the =File > +Download as > HTML= (or =PDF=) menu option. This can also be done from +the command line with the following command: + +#+begin_src sh :results output :exports both +ipython3 nbconvert --to pdf Untitled.ipynb +#+end_src + +If you want to use a specific style, then the nbconvert exporter +should be customised. This is discussed and demoed [[http://markus-beuckelmann.de/blog/customizing-nbconvert-pdf.html][here]]. We encourage +you to simply read the [[https://nbconvert.readthedocs.io/en/latest/][doc of nbconvert]]. + +Instead of going directly through LaTeX and playing too much with the +nbconvert exporter, an other option consists in exporting to Markdown +and playing with [[https://pandoc.org/][pandoc]]. Both approaches work, it's rather a matter of +taste. +* Installing jupyter or jupyter hub on your own machine +** Installing jupyter +Here is what you should install: +#+begin_src shell :results output :exports both +sudo apt-get install jupyter-notebook python3-pip python3-matplotlib python3-numpy +#+end_src + +On my machine, I got the version 5.4.1: +#+begin_src shell :results output :exports both +jupyter-notebook --version +#+end_src + +#+RESULTS: +: 5.4.1 + +The ipython notebook can then be run with the following command: +#+begin_src shell :results output :exports both +jupyter-notebook +#+end_src +** Using R +If you also want to have the R kernel in jupyter, follow [[https://github.com/IRkernel/IRkernel#installation][these +instructions]]. + +Alternatively, you can install =rpy2= (see the [[*Running R and Python in the same notebook][Running R and Python in +the same notebook]] section). +#+begin_src shell :results output :exports both +sudo apt-get python3-rpy2 +#+end_src +** Exporting your notebooks with latex +Here is what I had to install to make sure the notebook export via +latex works: +#+begin_src shell :results output :exports both +sudo apt-get install wkhtmltopdf +sudo apt-get install texlive-xetex +#+end_src +** Interacting with gitlab +Here is our [[https://github.com/brospars/nb-git][jupyter extension that allows to git push/pull from the +notebooks]]: +#+begin_src shell :results output :exports both +jupyter nbextension install https://raw.githubusercontent.com/brospars/nb-git/master/nb-git.js +jupyter nbextension enable nb-git +#+end_src +** Interesting extensions +- [[https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook][Code folding]] + #+begin_src shell :results output :exports both + pip3 install jupyter_contrib_nbextensions + # jupyter contrib nbextension install --user # not done yet + #+end_src +- [[https://github.com/kirbs-/hide_code][Hiding code]] + #+begin_src sh :results output :exports both + sudo pip3 install hide_code + sudo jupyter-nbextension install --py hide_code + jupyter-nbextension enable --py hide_code + jupyter-serverextension enable --py hide_code + #+end_src +** Installing jupyterhub +#+BEGIN_QUOTE +Benoit may give a few hints on this. +#+END_QUOTE diff --git a/module2/ressources/replicable_article/Makefile b/module2/ressources/replicable_article/Makefile new file mode 100644 index 0000000..c758981 --- /dev/null +++ b/module2/ressources/replicable_article/Makefile @@ -0,0 +1,25 @@ +ARCHIVE=replicable_article +# ARCHIVE_FILES=$(shell git ls-tree -r master --name-only | grep -v -e 'article.pdf') +ARCHIVE_FILES=article.org biblio.bib Makefile +all: article.pdf + +%.tex: %.org + emacs -q -batch --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" $^ --funcall org-latex-export-to-latex + +%.pdf: %.tex + pdflatex $^ + bibtex `basename $^ .tex` + pdflatex $^ + pdflatex $^ + +%.html: %.org + emacs -q -batch --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" $^ --funcall org-html-export-to-html + +$(ARCHIVE).tgz: $(ARCHIVE_FILES) + tar --xform "s|^|$(ARCHIVE)/|" -zcf $@ $^ + +clean: + rm -f article.aux article.bbl article.blg article.log article.out *~ + +distclean: clean + rm -f article.html article.tex article.pdf figure.pdf data.csv measurements.txt IEEEtran.bst IEEEtran.cls \#article.org\# diff --git a/module2/ressources/replicable_article/article.org b/module2/ressources/replicable_article/article.org new file mode 100644 index 0000000..64a9d3b --- /dev/null +++ b/module2/ressources/replicable_article/article.org @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# -*- mode: org -*- + +#+TITLE: Org Mode Template for an IEEE Conference Article +#+AUTHOR: John Doe, John Smith, and Jane Doe + +#+STARTUP: overview indent inlineimages logdrawer +#+LANGUAGE: en +#+OPTIONS: num:nil toc:t \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+OPTIONS: author:nil email:nil creator:nil timestamp:t +#+TAGS: noexport(n) deprecated(d) +#+EXPORT_SELECT_TAGS: export +#+EXPORT_EXCLUDE_TAGS: noexport + +# # Default org-mode HTML style +# #+HTML_HEAD: +# # Shiny readthedocs HTML style +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + + +# ### By default, all code chunks are being run when exporting. To +# ### avoid this, simply remove the "# " of the next line. +# #+PROPERTY: header-args :eval never-export + +#+LATEX_CLASS: IEEEtran +#+LATEX_HEADER: \usepackage[T1]{fontenc} +#+LATEX_HEADER: \usepackage[utf8]{inputenc} +#+LATEX_HEADER: \usepackage{graphicx} +#+LATEX_HEADER: \usepackage{xspace,ifthen} +#+LATEX_HEADER: \usepackage{amsmath,amssymb} +#+LATEX_HEADER: \usepackage[american]{babel} +#+LATEX_HEADER: \usepackage{url} \urlstyle{sf} + +#+BEGIN_EXPORT latex +\let\oldcite=\cite +\renewcommand\cite[2][]{~\ifthenelse{\equal{#1}{}}{\oldcite{#2}}{\oldcite[#1]{#2}}\xspace} +\let\oldref=\ref +\def\ref#1{~\oldref{#1}\xspace} +\sloppy +#+END_EXPORT + +#+BEGIN_EXPORT latex + \title{Org Mode Template for an IEEE Conference Article} + %\subtitle{} + + \author{% + \IEEEauthorblockN{% + John Doe\IEEEauthorrefmark{1}, + John Smith\IEEEauthorrefmark{2}, + Jane Doe\IEEEauthorrefmark{1}, + }\smallskip +% \\ + \IEEEauthorblockA{ + \IEEEauthorrefmark{1}University of Middle-of-Nowhere; \url{firstname.lastname@mon.edu}} + \IEEEauthorblockA{ + \IEEEauthorrefmark{2}Institute of Whatever; \url{firstname.lastname@smith.org}} + } + + \maketitle + +#+END_EXPORT + +#+BEGIN_abstract + Reproducible research has become increasingly important, just like + parallel architectures so we propose a novel experimental study of a + parallel implementation of the quicksort algorithm that builds on + reproducible research technology. +#+END_abstract +* Getting the LaTeX packages :noexport: +#+begin_src shell :results output :exports both +set -e +if which wget; then + wget --no-check-certificate -O IEEEtran.cls http://mirror.ibcp.fr/pub/CTAN/macros/latex/contrib/IEEEtran/IEEEtran.cls + wget --no-check-certificate -O IEEEtran.bst http://mirrors.ctan.org/macros/latex/contrib/IEEEtran/bibtex/IEEEtran.bst +else + if which curs; then + curl -o IEEEtran.cls http://mirror.ibcp.fr/pub/CTAN/macros/latex/contrib/IEEEtran/IEEEtran.cls + curl -o IEEEtran.bst http://mirrors.ctan.org/macros/latex/contrib/IEEEtran/bibtex/IEEEtran.bst + else + echo "Neither wget nor curl was found!!! Get a real OS!" 1>&2 + exit 1 + fi +fi +#+end_src + +* Getting the data :noexport: +#+begin_src shell :results output raw :exports both +wget --no-check-certificate -O measurements.txt https://raw.githubusercontent.com/alegrand/M2R-ParallelQuicksort/master/data/sama_2014-10-13/measurements_03%3A47.txt +echo 'file:measurements.txt' +#+end_src + +* Extracting traces from data files :noexport: + +#+begin_src perl :results output raw :exports both :var input="measurements.txt" output="data.csv" +use strict; +open INPUT, $input; +open OUTPUT, "> $output"; + +my($line); +my($size); +my($seq,$par,$libc); + +print OUTPUT "Size, Seq, Par, Libc\n" ; +while($line=) { + chomp $line; + if($line =~/^Size: ([\d\.]*)$/) { + $size = $1; + next; + } + if($line =~/^Sequential quicksort.*: ([\d\.]*) sec.$/) { + $seq=$1; next; + } + if($line =~/^Parallel quicksort.*: ([\d\.]*) sec.$/) { + $par=$1; next; + } + if($line =~/^Built-in quicksort.*: ([\d\.]*) sec.$/) { + $libc=$1; + print OUTPUT "$size, $seq, $par, $libc\n"; + next; + } +} +print "file:$output" +#+end_src + +* R functions :noexport: +Initialization and reading of the data. +#+begin_src R :results output :session *R* :exports both +df=read.csv("data.csv",strip.white=T,header=T) +#+end_src + +#+RESULTS: + +Let's compute some (crappy) statistics. +#+begin_src R :results output :session *R* :exports both +sdf = data.frame() +for(size in unique(df$Size)) { + seq = mean(df[df$Size == size,]$Seq) + par = mean(df[df$Size == size,]$Par) + libc = mean(df[df$Size == size,]$Libc) + sdf = rbind(sdf,data.frame(Size=size,Seq=seq,Par=par,Libc=libc)) +} +#+end_src + +#+RESULTS: + +* Introduction + With the advent of parallel architecture, it is tempting to propose + parallel implementations of classical operations. In this wonderful + article, we report the performance gain of the well known quicksort + algorithm, whose parallelization seems natural. +* Context + Quicksort (sometimes called partition-exchange sort) is an efficient + sorting algorithm, serving as a systematic method for placing the + elements of an array in order. Developed by Tony Hoare in 1959 with + his work published in 1961\cite{qsort}, it is still a commonly used + algorithm for sorting. Quicksort is a divide and conquer + algorithm. Quicksort first divides a large array into two smaller + sub-arrays: the low elements and the high elements. Quicksort can + then recursively sort the sub-arrays. We propose to sort the + sub-arrays in parallel on two threads and to bound the recursion + level. +* Related Work + Well, this is such a brilliant and novel idea that none has worked + on this cutting-edge topic. Parallel architecture barely existed in + 1959, when Hoare proposed the sequential version of this + algorithm\cite{qsort}. Some colleagues mentioned some obscure + parallelization of the partitioning phase but it is too complex to + implement and certainly too costly to provide any performance gain. +* Methodology + We used a Dell Latitude 6430u with 16Gb of RAM running a Debian with + Linux 3.14.15. The CPU is an Intel(R) Core(TM) i7-3687U CPU @ + 2.10GHz comprising two physical cores and hyperthreading. The + =performance= frequency governor was used. We used FCC 5.3.1 with the + following compilation flags: =-g -Wall -O2 -pthread -lrt=. Since we + care a lot about reproducibility of our research, all the sources + and detailed information regarding our experiments are provided on + [[https://github.com/alegrand/M2R-ParallelQuicksort/blob/master/journal.org][Github]] + #+LaTeX:\footnote{Or figshare, or zenodo, or whatever platform you prefer!}. + + We used the wonderful Org-mode + format\cite{schulte11:_activ_docum_org_mode} to both document our + experiments and create a replicable article that can be obtained on + [[https://github.com/alegrand/RR_webinars/blob/master/1_replicable_article_laboratory_notebook/replicable/article.org][Github]] as well. We could have used the Ipython + approach\cite{PER-GRA:2007} but we dishonestly ruled it out because + we wanted to be in full control of our C experimental setup and did + not know how to properly use it to write a replicable article. + + Finally, it is important to explain that each measurement was + repeated five times and the set of experiments was absolutely not + randomized, which may compromise the validity of our observations + and conclusions. +* Experimental results + #+begin_src R :results graphics :file "figure.pdf" :exports none :width 6 :height 4 :session *R* + # This code will not appear. It is just here to generate a nice figure to include later on. + linetype <- c(1:3) + plotchar <- c(1:3) + + plot(sdf$Size,sdf$Seq,log="x", type="b", lty=linetype[1], pch=plotchar[1]) + legend( x="topleft", + legend=c("Sequential execution","Parallel execution", "Default Libc execution"), + lwd=1, lty=linetype, pch=plotchar) + lines(sdf$Size,sdf$Par, type="b", lty=linetype[2], pch=plotchar[2]) + lines(sdf$Size,sdf$Libc, type="b", lty=linetype[3], pch=plotchar[3]) + #+end_src + + #+RESULTS: + [[file:figure.pdf]] + + As we can see in Figure\ref{fig.comparison}, to benefit from the parallel + version of our quicksort implementation, significantly large arrays + (over a million entry) are required. Of course, it is difficult to + conclude from so few measurements and a better experiment design + would be useful. + #+LaTeX: \vspace{-1cm} + + #+CAPTION: Comparing performances of several implementation of the quicksort algorithm\label{fig.comparison} + #+ATTR_LaTeX: :width .8\linewidth + file:figure.pdf + #+LaTeX: \vspace{-.3cm} + +* Conclusion +Exploiting parallel machine can be quite difficult and tedious. From +our experience, such architecture are useful only when processing +sufficiently large data sets. As a future work, we intend to +consolidate our study with more experiments. + +#+Latex:\section*{Acknowledgments} +This work is partially supported by the FOO and BAR +projects. Experiments presented in this paper were carried out using +our own experimental testbed with support of our university. + +#+LaTeX: \nocite{*} +#+LaTeX: \def\raggedright{} +#+LaTeX: \bibliographystyle{IEEEtran} +#+LaTeX: \bibliography{biblio} +* Emacs Setup :noexport: + This document has local variables in its postembule, which should + allow Org-mode to work seamlessly without any setup. If you're + uncomfortable using such variables, you can safely ignore them at + startup. Exporting may require that you copy them in your .emacs. + +# Local Variables: +# eval: (add-to-list 'load-path ".") +# eval: (require 'org-install) +# eval: (org-babel-do-load-languages 'org-babel-load-languages '((shell . t) (R . t) (perl . t) (python . t) )) +# eval: (setq org-confirm-babel-evaluate nil) +# eval: (unless (boundp 'org-latex-classes) (setq org-latex-classes nil)) +# eval: (add-to-list 'org-latex-classes '("IEEEtran" +# "\\documentclass[conference, 10pt, compsocconf]{IEEEtran}\n \[NO-DEFAULT-PACKAGES]\n \[EXTRA]\n \\usepackage{graphicx}\n \\usepackage{hyperref}" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) +# eval: (setq org-alphabetical-lists t) +# eval: (setq org-src-fontify-natively t) +# eval: (setq ess-ask-for-ess-directory nil) +# eval: (setq ispell-local-dictionary "american") +# eval: (eval (flyspell-mode t)) +# End: + + diff --git a/module2/ressources/replicable_article/article.pdf b/module2/ressources/replicable_article/article.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7e7a0fec06bd135c8710fa6a505b77548e8e3931 GIT binary patch literal 68042 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 Osf8hzs;aBM8y5hmsBHrP literal 0 HcmV?d00001 diff --git a/module2/ressources/replicable_article/biblio.bib b/module2/ressources/replicable_article/biblio.bib new file mode 100644 index 0000000..9cdf021 --- /dev/null +++ b/module2/ressources/replicable_article/biblio.bib @@ -0,0 +1,46 @@ +@article{schulte11:_activ_docum_org_mode, +author ={Eric Schulte and Dan Davison}, +title ={Active Document with Org-Mode}, +journal ={Computing in Science \& Engineering}, +year =2011, +volume =13, +number =3, +pages ={66--73}, +month ={May/June} +} + +@Article{PER-GRA:2007, + Author = {P\'erez, Fernando and Granger, Brian E.}, + Title = {{IP}ython: a System for Interactive Scientific Computing}, + Journal = {Computing in Science and Engineering}, + Volume = {9}, + Number = {3}, + Pages = {21--29}, + month = may, + year = 2007, + url = "http://ipython.org", + ISSN = "1521-9615", + doi = {10.1109/MCSE.2007.53}, + publisher = {IEEE Computer Society}, +} + + + +@article{qsort, + author = {Hoare, C. A. R.}, + title = {Algorithm 64: Quicksort}, + journal = {Commun. ACM}, + issue_date = {July 1961}, + volume = {4}, + number = {7}, + month = jul, + year = {1961}, + issn = {0001-0782}, + pages = {321--}, + url = {http://doi.acm.org/10.1145/366622.366644}, + doi = {10.1145/366622.366644}, + acmid = {366644}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + diff --git a/module2/ressources/replicable_article/measurements.txt b/module2/ressources/replicable_article/measurements.txt new file mode 100644 index 0000000..b0f16ba --- /dev/null +++ b/module2/ressources/replicable_article/measurements.txt @@ -0,0 +1,100 @@ +Size: 100 +Sequential quicksort took: 0.000010 sec. +Parallel quicksort took: 0.004024 sec. +Built-in quicksort took: 0.000013 sec. +Size: 100 +Sequential quicksort took: 0.000010 sec. +Parallel quicksort took: 0.004448 sec. +Built-in quicksort took: 0.000014 sec. +Size: 100 +Sequential quicksort took: 0.000009 sec. +Parallel quicksort took: 0.003384 sec. +Built-in quicksort took: 0.000013 sec. +Size: 100 +Sequential quicksort took: 0.000010 sec. +Parallel quicksort took: 0.003738 sec. +Built-in quicksort took: 0.000012 sec. +Size: 100 +Sequential quicksort took: 0.000010 sec. +Parallel quicksort took: 0.003133 sec. +Built-in quicksort took: 0.000011 sec. +Size: 1000 +Sequential quicksort took: 0.000128 sec. +Parallel quicksort took: 0.020407 sec. +Built-in quicksort took: 0.000209 sec. +Size: 1000 +Sequential quicksort took: 0.000126 sec. +Parallel quicksort took: 0.022003 sec. +Built-in quicksort took: 0.000201 sec. +Size: 1000 +Sequential quicksort took: 0.000128 sec. +Parallel quicksort took: 0.016149 sec. +Built-in quicksort took: 0.000210 sec. +Size: 1000 +Sequential quicksort took: 0.000128 sec. +Parallel quicksort took: 0.014594 sec. +Built-in quicksort took: 0.000209 sec. +Size: 1000 +Sequential quicksort took: 0.000129 sec. +Parallel quicksort took: 0.014905 sec. +Built-in quicksort took: 0.000210 sec. +Size: 10000 +Sequential quicksort took: 0.001774 sec. +Parallel quicksort took: 0.018943 sec. +Built-in quicksort took: 0.001720 sec. +Size: 10000 +Sequential quicksort took: 0.001698 sec. +Parallel quicksort took: 0.016226 sec. +Built-in quicksort took: 0.001733 sec. +Size: 10000 +Sequential quicksort took: 0.001652 sec. +Parallel quicksort took: 0.017348 sec. +Built-in quicksort took: 0.001702 sec. +Size: 10000 +Sequential quicksort took: 0.001680 sec. +Parallel quicksort took: 0.017302 sec. +Built-in quicksort took: 0.001726 sec. +Size: 10000 +Sequential quicksort took: 0.001675 sec. +Parallel quicksort took: 0.017386 sec. +Built-in quicksort took: 0.001716 sec. +Size: 100000 +Sequential quicksort took: 0.020040 sec. +Parallel quicksort took: 0.050548 sec. +Built-in quicksort took: 0.020300 sec. +Size: 100000 +Sequential quicksort took: 0.020004 sec. +Parallel quicksort took: 0.043119 sec. +Built-in quicksort took: 0.020504 sec. +Size: 100000 +Sequential quicksort took: 0.019763 sec. +Parallel quicksort took: 0.050735 sec. +Built-in quicksort took: 0.020439 sec. +Size: 100000 +Sequential quicksort took: 0.019913 sec. +Parallel quicksort took: 0.049806 sec. +Built-in quicksort took: 0.020541 sec. +Size: 100000 +Sequential quicksort took: 0.019726 sec. +Parallel quicksort took: 0.044636 sec. +Built-in quicksort took: 0.020252 sec. +Size: 1000000 +Sequential quicksort took: 0.230648 sec. +Parallel quicksort took: 0.162221 sec. +Built-in quicksort took: 0.242869 sec. +Size: 1000000 +Sequential quicksort took: 0.235778 sec. +Parallel quicksort took: 0.162137 sec. +Built-in quicksort took: 0.241607 sec. +Size: 1000000 +Sequential quicksort took: 0.238383 sec. +Parallel quicksort took: 0.163279 sec. +Built-in quicksort took: 0.242786 sec. +Size: 1000000 +Sequential quicksort took: 0.232921 sec. +Parallel quicksort took: 0.170237 sec. +Built-in quicksort took: 0.241583 sec. +Size: 1000000 +Sequential quicksort took: 0.230096 sec. +Parallel quicksort took: 0.153896 sec. +Built-in quicksort took: 0.242492 sec. diff --git a/module2/ressources/rr_org/init.el b/module2/ressources/rr_org/init.el new file mode 100644 index 0000000..619e502 --- /dev/null +++ b/module2/ressources/rr_org/init.el @@ -0,0 +1,212 @@ +(require 'org-install) +(require 'org) + +(setq inhibit-splash-screen t) + +(setq frame-title-format + '("Emacs - " (buffer-file-name "%f" + (dired-directory dired-directory "%b")))) + + (global-font-lock-mode t) + (custom-set-faces + '(flyspell-incorrect ((t (:inverse-video t))))) + +(line-number-mode 1) +(column-number-mode 1) + +(load-library "paren") +(show-paren-mode 1) +(transient-mark-mode t) +(require 'paren) + +(defalias 'yes-or-no-p 'y-or-n-p) + +(set-terminal-coding-system 'utf-8) +(set-keyboard-coding-system 'utf-8) +(prefer-coding-system 'utf-8) + + (setq + ns-command-modifier 'meta ; Apple/Command key is Meta + ns-alternate-modifier nil ; Option is the Mac Option key + ns-use-mac-modifier-symbols nil ; display standard Emacs (and not standard Mac) modifier symbols + ) + +(cua-mode t) + +(defun jump-mark () + (interactive) + (set-mark-command (point))) +(defun beginning-of-defun-and-mark () + (interactive) + (push-mark (point)) + (beginning-of-defun)) +(defun end-of-defun-and-mark () + (interactive) + (push-mark (point)) + (end-of-defun)) + +(global-set-key "\^c\^b" 'beginning-of-defun-and-mark) +(global-set-key "\^c\^e" 'end-of-defun-and-mark) +(global-set-key "\^c\^j" 'jump-mark) +(global-set-key [S-f6] 'jump-mark) ;; jump from mark to mark + +(global-set-key "\M-g" 'goto-line) + +(global-set-key (kbd "C-+") 'text-scale-increase) +(global-set-key (kbd "C--") 'text-scale-decrease) +;; C-x C-0 restores the default font size + +;; Inspired from http://tex.stackexchange.com/questions/166681/changing-language-of-flyspell-emacs-with-a-shortcut +;; (defun spell (choice) +;; "Switch between language dictionaries." +;; (interactive "cChoose: (a) American | (f) Francais") +;; (cond ((eq choice ?1) +;; (setq flyspell-default-dictionary "american") +;; (setq ispell-dictionary "american") +;; (ispell-kill-ispell)) +;; ((eq choice ?2) +;; (setq flyspell-default-dictionary "francais") +;; (setq ispell-dictionary "francais") +;; (ispell-kill-ispell)) +;; (t (message "No changes have been made."))) ) + +(define-key global-map (kbd "C-c s a") (lambda () (interactive) (ispell-change-dictionary "american"))) +(define-key global-map (kbd "C-c s f") (lambda () (interactive) (ispell-change-dictionary "francais"))) +(define-key global-map (kbd "C-c s r") 'flyspell-region) +(define-key global-map (kbd "C-c s b") 'flyspell-buffer) +(define-key global-map (kbd "C-c s s") 'flyspell-mode) + +(global-set-key [f5] '(lambda () (interactive) (revert-buffer nil t nil))) + +(defun auto-fill-mode-on () (TeX-PDF-mode 1)) +(add-hook 'tex-mode-hook 'TeX-PDF-mode-on) +(add-hook 'latex-mode-hook 'TeX-PDF-mode-on) +(setq TeX-PDF-mode t) + +(defun auto-fill-mode-on () (auto-fill-mode 1)) +(add-hook 'text-mode-hook 'auto-fill-mode-on) +(add-hook 'emacs-lisp-mode 'auto-fill-mode-on) +(add-hook 'tex-mode-hook 'auto-fill-mode-on) +(add-hook 'latex-mode-hook 'auto-fill-mode-on) + +(setq org-directory "~/org/") + +(setq org-hide-leading-stars t) +(setq org-alphabetical-lists t) +(setq org-src-fontify-natively t) ;; you want this to activate coloring in blocks +(setq org-src-tab-acts-natively t) ;; you want this to have completion in blocks +(setq org-hide-emphasis-markers t) ;; to hide the *,=, or / markers +(setq org-pretty-entities t) ;; to have \alpha, \to and others display as utf8 http://orgmode.org/manual/Special-symbols.html + +(global-set-key "\C-cl" 'org-store-link) +(global-set-key "\C-cc" 'org-capture) +(global-set-key (kbd "C-c a") 'org-agenda) +(define-key global-map "\C-cl" 'org-store-link) +(define-key global-map (kbd "C-c a") 'org-agenda) +(global-set-key "\C-cb" 'org-iswitchb) +(setq org-default-notes-file "~/org/notes.org") + (define-key global-map "\C-cd" 'org-capture) +(setq org-capture-templates (quote (("t" "Todo" entry (file+headline "~/org/liste.org" "Tasks") "* TODO %? + %i + %a" :prepend t) ("j" "Journal" entry (file+datetree "~/org/journal.org") "* %? +Entered on %U + %i + %a")))) + +(setq org-agenda-include-all-todo t) +(setq org-agenda-include-diary t) + +(global-set-key (kbd "C-c d") 'insert-date) +(defun insert-date (prefix) + "Insert the current date. With prefix-argument, use ISO format. With + two prefix arguments, write out the day and month name." + (interactive "P") + (let ((format (cond + ((not prefix) "** %Y-%m-%d") + ((equal prefix '(4)) "[%Y-%m-%d]")))) + (insert (format-time-string format)))) + +(global-set-key (kbd "C-c t") 'insert-time-date) +(defun insert-time-date (prefix) + "Insert the current date. With prefix-argument, use ISO format. With + two prefix arguments, write out the day and month name." + (interactive "P") + (let ((format (cond + ((not prefix) "[%H:%M:%S; %d.%m.%Y]") + ((equal prefix '(4)) "[%H:%M:%S; %Y-%m-%d]")))) + (insert (format-time-string format)))) + +(global-set-key (kbd "C-c l") 'org-store-link) + +(global-set-key (kbd "C-c ") 'outline-up-heading) +(global-set-key (kbd "C-c ") 'outline-previous-visible-heading) +(global-set-key (kbd "C-c ") 'outline-next-visible-heading) + +;; In org-mode 9 you need to have #+PROPERTY: header-args :eval never-export +;; in the beginning or your document to tell org-mode not to evaluate every +;; code block every time you export. +(setq org-confirm-babel-evaluate nil) ;; Do not ask for confirmation all the time!! + + (org-babel-do-load-languages + 'org-babel-load-languages + '( + (shell . t) + (python . t) + (R . t) + (ruby . t) + (ocaml . t) + (ditaa . t) + (dot . t) + (octave . t) + (sqlite . t) + (perl . t) + (screen . t) + (plantuml . t) + (lilypond . t) + (org . t) + (makefile . t) + )) + (setq org-src-preserve-indentation t) + +(add-to-list 'org-structure-template-alist + '("s" "#+begin_src ?\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("m" "#+begin_src emacs-lisp :tangle init.el\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("r" "#+begin_src R :results output :session *R* :exports both\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("R" "#+begin_src R :results output graphics :file (org-babel-temp-file \"figure\" \".png\") :exports both :width 600 :height 400 :session *R* \n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("RR" "#+begin_src R :results output graphics :file (org-babel-temp-file (concat (file-name-directory (or load-file-name buffer-file-name)) \"figure-\") \".png\") :exports both :width 600 :height 400 :session *R* \n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("p" "#+begin_src python :results output :exports both\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("P" "#+begin_src python :results output :session *python* :exports both\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("PP" "#+begin_src python :results file :var matplot_lib_filename=(org-babel-temp-file \"figure\" \".png\") :exports both \nimport matplotlib.pyplot as plt\n\nimport numpy\nx=numpy.linspace(-15,15)\nplt.figure(figsize=(10,5))\nplt.plot(x,numpy.cos(x)/x)\nplt.tight_layout()\n\nplt.savefig(matplot_lib_filename)\nreturn(matplot_lib_filename)\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("b" "#+begin_src shell :results output :exports both\n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("B" "#+begin_src shell :session *shell* :results output :exports both \n\n#+end_src" "\n\n")) + +(add-to-list 'org-structure-template-alist + '("g" "#+begin_src dot :results output graphics :file \"/tmp/graph.pdf\" :exports both + digraph G { + node [color=black,fillcolor=white,shape=rectangle,style=filled,fontname=\"Helvetica\"]; + A[label=\"A\"] + B[label=\"B\"] + A->B + }\n#+end_src" "\n\n")) + +(add-hook 'org-babel-after-execute-hook 'org-display-inline-images) +(add-hook 'org-mode-hook 'org-display-inline-images) +(add-hook 'org-mode-hook 'org-babel-result-hide-all) diff --git a/module2/ressources/rr_org/init.org b/module2/ressources/rr_org/init.org new file mode 100644 index 0000000..9e26437 --- /dev/null +++ b/module2/ressources/rr_org/init.org @@ -0,0 +1,360 @@ +# -*- mode: org -*- +#+TITLE: Emacs init file written in org-mode +#+AUTHOR: Arnaud Legrand +#+EMAIL: arnaud.legrand@imag.fr +#+STARTUP: indent +#+LANGUAGE: en + +This is a "minimal" =.emacs= configuration file. For this configuration +to work, you'll need: +- emacs25 (>25.2) (this way installing through elpa will save you some + time) and emacs-goodies (e.g., for color themes) +- org-mode > 9.0 (there has been several major compatibility breakage + so need to stay away from old versions) +- ess and R +- texlive and auctex + +* Installation Instructions +Backup you own =.emacs= if you have one and replace it with [[file:init.el][the content +of this file]]. If you ever want to regenerate if from this org +document, simply =M-x org-babel-tangle=. +* Loading files: +** Loading babel: :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(require 'org-install) +(require 'org) +#+end_src +* Emacs aesthetics: +** Remove splash screen: :WEB: +#+begin_src emacs-lisp :tangle init.el +(setq inhibit-splash-screen t) +#+end_src +** Change frame name of emacs: :LUKA:WEB: +#+begin_src emacs-lisp :tangle init.el +(setq frame-title-format + '("Emacs - " (buffer-file-name "%f" + (dired-directory dired-directory "%b")))) +#+end_src +** Text coloring :ARNAUD: +#+begin_src emacs-lisp :tangle init.el + (global-font-lock-mode t) + (custom-set-faces + '(flyspell-incorrect ((t (:inverse-video t))))) +#+end_src +** Line and column numbering :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(line-number-mode 1) +(column-number-mode 1) +#+end_src +** Parenthesis :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(load-library "paren") +(show-paren-mode 1) +(transient-mark-mode t) +(require 'paren) +#+end_src +** Asking for confirmation concisely: :WEB: +Link: http://org.ryuslash.org/dotfiles/emacs/init.html#sec-7-1 Being +asked to type in yes explicitly all the time gets very tedious. I +understand that it is safer since y is much easier to type in +accidentally than yes and so the potential to say yes to things you +don't want is there, but I haven't had any such problems yet. + +#+begin_src emacs-lisp :tangle init.el +(defalias 'yes-or-no-p 'y-or-n-p) +#+end_src +* Shortcuts: +** UTF 8 by default :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(set-terminal-coding-system 'utf-8) +(set-keyboard-coding-system 'utf-8) +(prefer-coding-system 'utf-8) +#+end_src +** Keyboard fix for Mac OS X users... :ADRIEN: +Thanks to Adrien Lebre for providing me with this +=ns-use-mac-modifier-symbols= thing. Unfortunately, this is broken at +the moment (I tried to wrap the command around the cond but it should +fail on mac). +#+begin_src emacs-lisp :tangle init.el + (setq + ns-command-modifier 'meta ; Apple/Command key is Meta + ns-alternate-modifier nil ; Option is the Mac Option key + ns-use-mac-modifier-symbols nil ; display standard Emacs (and not standard Mac) modifier symbols + ) +#+end_src +** CUA mode a.k.a =C-x, C-c, C-v= +Yuck! Many people like this but I hate it as it conflicts with some of +my other shortcuts (e.g., the ones for spelling a region). +#+begin_src emacs-lisp :tangle init.el +(cua-mode t) +#+end_src +** Navigate back in text :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(defun jump-mark () + (interactive) + (set-mark-command (point))) +(defun beginning-of-defun-and-mark () + (interactive) + (push-mark (point)) + (beginning-of-defun)) +(defun end-of-defun-and-mark () + (interactive) + (push-mark (point)) + (end-of-defun)) + +(global-set-key "\^c\^b" 'beginning-of-defun-and-mark) +(global-set-key "\^c\^e" 'end-of-defun-and-mark) +(global-set-key "\^c\^j" 'jump-mark) +(global-set-key [S-f6] 'jump-mark) ;; jump from mark to mark +#+end_src +** Goto line :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(global-set-key "\M-g" 'goto-line) +#+end_src +** Increase/decrease text size in emacs :WEB: +#+begin_src emacs-lisp :tangle init.el +(global-set-key (kbd "C-+") 'text-scale-increase) +(global-set-key (kbd "C--") 'text-scale-decrease) +;; C-x C-0 restores the default font size +#+end_src +[11:26:47; 18.04.2014] +** Add spell checker to the file :WEB: +#+begin_src emacs-lisp :tangle init.el +;; Inspired from http://tex.stackexchange.com/questions/166681/changing-language-of-flyspell-emacs-with-a-shortcut +;; (defun spell (choice) +;; "Switch between language dictionaries." +;; (interactive "cChoose: (a) American | (f) Francais") +;; (cond ((eq choice ?1) +;; (setq flyspell-default-dictionary "american") +;; (setq ispell-dictionary "american") +;; (ispell-kill-ispell)) +;; ((eq choice ?2) +;; (setq flyspell-default-dictionary "francais") +;; (setq ispell-dictionary "francais") +;; (ispell-kill-ispell)) +;; (t (message "No changes have been made."))) ) + +(define-key global-map (kbd "C-c s a") (lambda () (interactive) (ispell-change-dictionary "american"))) +(define-key global-map (kbd "C-c s f") (lambda () (interactive) (ispell-change-dictionary "francais"))) +(define-key global-map (kbd "C-c s r") 'flyspell-region) +(define-key global-map (kbd "C-c s b") 'flyspell-buffer) +(define-key global-map (kbd "C-c s s") 'flyspell-mode) +#+end_src +** Reload buffer :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(global-set-key [f5] '(lambda () (interactive) (revert-buffer nil t nil))) +#+end_src +* Small fixes for LaTeX: +** PDF with LaTeX by default :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(defun auto-fill-mode-on () (TeX-PDF-mode 1)) +(add-hook 'tex-mode-hook 'TeX-PDF-mode-on) +(add-hook 'latex-mode-hook 'TeX-PDF-mode-on) +(setq TeX-PDF-mode t) +#+end_src +** Auto-fill-mode +#+begin_src emacs-lisp :tangle init.el +(defun auto-fill-mode-on () (auto-fill-mode 1)) +(add-hook 'text-mode-hook 'auto-fill-mode-on) +(add-hook 'emacs-lisp-mode 'auto-fill-mode-on) +(add-hook 'tex-mode-hook 'auto-fill-mode-on) +(add-hook 'latex-mode-hook 'auto-fill-mode-on) +#+end_src +* Org-mode convenient configuration +** Default directory +#+begin_src emacs-lisp :tangle init.el +(setq org-directory "~/org/") +#+end_src +** Cosmetics +#+begin_src emacs-lisp :tangle init.el +(setq org-hide-leading-stars t) +(setq org-alphabetical-lists t) +(setq org-src-fontify-natively t) ;; you want this to activate coloring in blocks +(setq org-src-tab-acts-natively t) ;; you want this to have completion in blocks +(setq org-hide-emphasis-markers t) ;; to hide the *,=, or / markers +(setq org-pretty-entities t) ;; to have \alpha, \to and others display as utf8 http://orgmode.org/manual/Special-symbols.html +#+end_src +** Agenda +*** Add short cut keys for the org-agenda :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(global-set-key "\C-cl" 'org-store-link) +(global-set-key "\C-cc" 'org-capture) +(global-set-key (kbd "C-c a") 'org-agenda) +(define-key global-map "\C-cl" 'org-store-link) +(define-key global-map (kbd "C-c a") 'org-agenda) +(global-set-key "\C-cb" 'org-iswitchb) +(setq org-default-notes-file "~/org/notes.org") + (define-key global-map "\C-cd" 'org-capture) +(setq org-capture-templates (quote (("t" "Todo" entry (file+headline "~/org/liste.org" "Tasks") "* TODO %? + %i + %a" :prepend t) ("j" "Journal" entry (file+datetree "~/org/journal.org") "* %? +Entered on %U + %i + %a")))) +#+end_src + +#+RESULTS: +| t | Todo | entry | (file+headline ~/org/liste.org Tasks) | * TODO %?\n %i\n %a | :prepend | t | +| j | Journal | entry | (file+datetree ~/org/journal.org) | * %?\nEntered on %U\n %i\n %a | | | + +*** Agenda config :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(setq org-agenda-include-all-todo t) +(setq org-agenda-include-diary t) +#+end_src +* Org-mode shortcuts +** Adding date with brackets with command "C-c d": :LUKA: +#+begin_src emacs-lisp :tangle init.el +(global-set-key (kbd "C-c d") 'insert-date) +(defun insert-date (prefix) + "Insert the current date. With prefix-argument, use ISO format. With + two prefix arguments, write out the day and month name." + (interactive "P") + (let ((format (cond + ((not prefix) "** %Y-%m-%d") + ((equal prefix '(4)) "[%Y-%m-%d]")))) + (insert (format-time-string format)))) +#+end_src +[16:34:01; 24.04.2013] + +** Adding date with command "C-c t": :LUKA: +#+begin_src emacs-lisp :tangle init.el +(global-set-key (kbd "C-c t") 'insert-time-date) +(defun insert-time-date (prefix) + "Insert the current date. With prefix-argument, use ISO format. With + two prefix arguments, write out the day and month name." + (interactive "P") + (let ((format (cond + ((not prefix) "[%H:%M:%S; %d.%m.%Y]") + ((equal prefix '(4)) "[%H:%M:%S; %Y-%m-%d]")))) + (insert (format-time-string format)))) +#+end_src +[16:34:15; 24.04.2013] +** Org-store-link: :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(global-set-key (kbd "C-c l") 'org-store-link) +#+end_src +** Navigating through org-mode: +Additional shortcuts for navigating through org-mode documents: +#+begin_src emacs-lisp :tangle init.el +(global-set-key (kbd "C-c ") 'outline-up-heading) +(global-set-key (kbd "C-c ") 'outline-previous-visible-heading) +(global-set-key (kbd "C-c ") 'outline-next-visible-heading) +#+end_src +* Org-mode + babel: +** Seamless use of babel (no confirmation, lazy export) :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +;; In org-mode 9 you need to have #+PROPERTY: header-args :eval never-export +;; in the beginning or your document to tell org-mode not to evaluate every +;; code block every time you export. +(setq org-confirm-babel-evaluate nil) ;; Do not ask for confirmation all the time!! +#+end_src +** Some initial languages we want org-babel to support: :ARNAUD: +#+begin_src emacs-lisp :tangle init.el + (org-babel-do-load-languages + 'org-babel-load-languages + '( + (shell . t) + (python . t) + (R . t) + (ruby . t) + (ocaml . t) + (ditaa . t) + (dot . t) + (octave . t) + (sqlite . t) + (perl . t) + (screen . t) + (plantuml . t) + (lilypond . t) + (org . t) + (makefile . t) + )) + (setq org-src-preserve-indentation t) +#+end_src + +** Adding source code blocks: :LUKA: +*** With capital letters: +To use this type \n\n")) +#+end_src +*** Emacs-elisp code: +To use this type \n\n")) +#+end_src + +*** R code: +To use this type \n\n")) +#+end_src + +To use this type \n\n")) +#+end_src + +To use this type \n\n")) +#+end_src +*** Python code +To use this type

\n\n")) +#+end_src + +#+begin_src emacs-lisp :tangle init.el +(add-to-list 'org-structure-template-alist + '("P" "#+begin_src python :results output :session *python* :exports both\n\n#+end_src" "\n\n")) +#+end_src + +#+begin_src emacs-lisp :tangle init.el +(add-to-list 'org-structure-template-alist + '("PP" "#+begin_src python :results file :var matplot_lib_filename=(org-babel-temp-file \"figure\" \".png\") :exports both \nimport matplotlib.pyplot as plt\n\nimport numpy\nx=numpy.linspace(-15,15)\nplt.figure(figsize=(10,5))\nplt.plot(x,numpy.cos(x)/x)\nplt.tight_layout()\n\nplt.savefig(matplot_lib_filename)\nreturn(matplot_lib_filename)\n#+end_src" "\n\n")) +#+end_src +*** Bash "sh" code: +To use this type \n\n")) +#+end_src + +To use this type \n\n")) +#+end_src +*** Graphviz +#+begin_src emacs-lisp :tangle init.el +(add-to-list 'org-structure-template-alist + '("g" "#+begin_src dot :results output graphics :file \"/tmp/graph.pdf\" :exports both + digraph G { + node [color=black,fillcolor=white,shape=rectangle,style=filled,fontname=\"Helvetica\"]; + A[label=\"A\"] + B[label=\"B\"] + A->B + }\n#+end_src" "\n\n")) +#+end_src +** Evaluating whole subtree: :LUKA: +#+begin_src emacs-lisp +(global-set-key (kbd "C-c S-t") 'org-babel-execute-subtree) +#+end_src +** Display images :ARNAUD: +#+begin_src emacs-lisp :tangle init.el +(add-hook 'org-babel-after-execute-hook 'org-display-inline-images) +(add-hook 'org-mode-hook 'org-display-inline-images) +(add-hook 'org-mode-hook 'org-babel-result-hide-all) +#+end_src diff --git a/module2/ressources/rr_org/journal.org b/module2/ressources/rr_org/journal.org new file mode 100644 index 0000000..64d4825 --- /dev/null +++ b/module2/ressources/rr_org/journal.org @@ -0,0 +1,96 @@ +# -*- mode: org -*- +# -*- coding: utf-8 -*- +#+STARTUP: overview indent inlineimages logdrawer +#+TITLE: Journal +#+AUTHOR: Put your name here +#+LANGUAGE: en +#+TAGS: LIG(L) HOME(H) Europe(E) Blog(B) noexport(n) Stats(S) +#+TAGS: Epistemology(E) Vulgarization(V) Teaching(T) R(R) OrgMode(O) Python(P) +#+EXPORT_SELECT_TAGS: Blog +#+OPTIONS: H:3 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:nil skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+EXPORT_SELECT_TAGS: export +#+EXPORT_EXCLUDE_TAGS: noexport +#+COLUMNS: %25ITEM %TODO %3PRIORITY %TAGS +#+SEQ_TODO: TODO(t!) STARTED(s!) WAITING(w@) APPT(a!) | DONE(d!) CANCELLED(c!) DEFERRED(f!) + +* 2018 +** 2018-02 March +*** 2018-02-12 Monday +**** Demonstrating Emacs/Orgmode shortcuts +These informations were gathered and first demonstrated in my [[https://github.com/alegrand/RR_webinars/blob/master/1_replicable_article_laboratory_notebook/index.org][First +webinar on reproducible research: litterate programming]]. +***** Emacs shortcuts +Here are a few convenient emacs shortcuts for those that have never +used emacs. In all of the emacs shortcuts, =C=Ctrl=, =M=Alt/Esc= and +=S=Shift=. Note that you may want to use two hours to follow the emacs +tutorial (=C-h t=). In the configuration file CUA keys have been +activated and allow you to use classical copy/paste (=C-c/C-v=) +shortcuts. This can be changed from the Options menu. + - =C-x C-c= exit + - =C-x C-s= save buffer + - =C-g= panic mode ;) type this whenever you want to exit an awful + series of shortcuts + - =C-Space= start selection marker although selection with shift and + arrows should work as well + - =C-l= reposition the screen + - =C-_= (or =C-z= if CUA keys have been activated) + - =C-s= search + - =M-%= replace + - =C-x C-h= get the list of emacs shortcuts + - =C-c C-h= get the list of emacs shortcuts considering the mode you are + currently using (e.g., C, Lisp, org, ...) + There are a bunch of cheatsheets also available out there (e.g., + [[http://www.shortcutworld.com/en/linux/Emacs_23.2.1.html][this one for emacs]] and [[http://orgmode.org/orgcard.txt][this one for org-mode]] or this [[http://sachachua.com/blog/wp-content/uploads/2013/05/How-to-Learn-Emacs-v2-Large.png][graphical one]]). +***** Org-mode + Many emacs shortcuts start by =C-x=. Org-mode's shortcuts generaly + start with =C-c=. + - =Tab= fold/unfold + - =C-c c= capture (finish capturing with =C-c C-c=, this is explained on + the top of the buffer that just opened) + - =C-c C-c= do something useful here (tag, execute, ...) + - =C-c C-o= open link + - =C-c C-t= switch todo + - =C-c C-e= export + - =M-Enter= new item/section + - =C-c a= agenda (try the =L= option) + - =C-c C-a= attach files + - =C-c C-d= set a deadl1ine (use =S-arrows= to navigate in the dates) + - =A-arrows= move subtree (add shift for the whole subtree) +***** Org-mode Babel (for literate programming) + - =