{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 2A.soft - Jupyter et commandes magiques\n", "\n", "Pour \u00eatre inventif, il faut \u00eatre un peu paresseux. Cela explique parfois la syntaxe peu compr\u00e9hensible mais r\u00e9duite de certaines instructions. Cela explique sans doute aussi que [Jupyter](http://jupyter.org/) offre la possibilit\u00e9 de d\u00e9finir des [commandes magiques](http://ipython.readthedocs.io/en/stable/config/custommagics.html) qu'on peut interpr\u00e9ter comme des raccourcis. ``%`` pour une ligne, ``%%`` pour une cellule."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Commande magique\n", "\n", "Ce sont des raccourcis. Si vous n'avez plus envie d'\u00e9crire le m\u00eame code tous les jours alors peut-\u00eatre que vous avez envie de cr\u00e9er une commande magique. C'est une fonctionnalit\u00e9 des notebooks Jupyter. L'exemple suivant cr\u00e9e une commande magique qui g\u00e9n\u00e8re une s\u00e9quence de nombre al\u00e9atoire dans le notebook. On l'appelle ``RND``. Cela se passe en trois \u00e9tapes :\n", "\n", "* impl\u00e9mentation de la commande\n", "* d\u00e9claration de la commande (pour Jupyter)\n", "* utilisation de la commande\n", "\n", "C'est l'objet des trois cellules qui suivent."]}, {"cell_type": "code", "execution_count": 2, "metadata": {"collapsed": true}, "outputs": [], "source": ["import random\n", "from IPython.core.magic import Magics, magics_class, line_magic, cell_magic, line_cell_magic\n", " \n", "@magics_class\n", "class CustomMagics(Magics):\n", " \n", " @line_magic\n", " def RND(self, line):\n", " return [ random.random() for i in range(0,int(line))]"]}, {"cell_type": "code", "execution_count": 3, "metadata": {"collapsed": true}, "outputs": [], "source": ["ip = get_ipython()\n", "ip.register_magics(CustomMagics)"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/plain": ["[0.7597340836812444,\n", " 0.7417183818784308,\n", " 0.5919053129335919,\n", " 0.42644466969431216,\n", " 0.025703336169412228,\n", " 0.37317015957688837,\n", " 0.5240186951312955,\n", " 0.47640296529847126,\n", " 0.9582206394610842,\n", " 0.2766903488489415,\n", " 0.3163718095585957,\n", " 0.2540976883769992,\n", " 0.41766681610331,\n", " 0.7107081118267403,\n", " 0.5675086760409057,\n", " 0.23741203524882026,\n", " 0.3511910318651611,\n", " 0.5027315091097999,\n", " 0.7218048703284364,\n", " 0.89482670010109]"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["%RND 20"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Exercice 1 : votre propre magique commande\n", "\n", "Je voulais vous demander comme exercice d'\u00e9crire une commande magique qui [envoie un mail](http://en.wikibooks.org/wiki/Python_Programming/Email). On pourrait imaginer une commande qui r\u00e9cup\u00e8re les messages facebook. Finalement, ce sera une commande magique ``%plot`` qui dessine le graphe de vos r\u00eaves. Vous pourrez perfectionner votre commande magique en lisant cette page [Registering callbacks](http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/JavaScript%20Notebook%20Extensions.html#Register-a-callback).\n", "\n", "**Remarque :** Si vous d\u00e9cidez d'automatiser l'envoi des mails, prenez garde de ne pas \u00e9crire votre mot de passe dans le code de votre programme surtout si son code est disponible sur [GitHub](https://github.com/). Il est pr\u00e9f\u00e9rable de le demander \u00e0 chaque fois ou de le stocker de fa\u00e7on crypt\u00e9e :\n", "\n", "* [django](https://github.com/django/django/blob/master/django/contrib/auth/hashers.py#L216)\n", "* [keyring](https://bitbucket.org/kang/python-keyring-lib)"]}, {"cell_type": "code", "execution_count": 5, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1"}}, "nbformat": 4, "nbformat_minor": 2}