<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.anunna.wur.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maas036</id>
	<title>HPCwiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.anunna.wur.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maas036"/>
	<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php/Special:Contributions/Maas036"/>
	<updated>2026-04-24T08:54:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2080</id>
		<title>Conda for teaching</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2080"/>
		<updated>2020-05-27T10:01:46Z</updated>

		<summary type="html">&lt;p&gt;Maas036: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You are going to give a teaching course, and you need a specific code environment.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
First - find a good location that everyone can read (and not write). I&#039;d suggest somewhere under &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/&amp;lt;/code&amp;gt; as a starting point - this allows everyone to access this location. It&#039;s important not to put anything secret there - it&#039;s a public resource, so please bear that in mind.&lt;br /&gt;
&lt;br /&gt;
Next - create a folder for your environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You may want to manipulate the permissions for this folder if someone is going to set this up with you. Consider the commands in [[Shared folders]].&lt;br /&gt;
&lt;br /&gt;
Then, install Anaconda into it (choose the year and month yourself!):&lt;br /&gt;
&lt;br /&gt;
Also, note that you need to make the sh script executable before you can run it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
wget https://repo.anaconda.com/archive/Anaconda3-YEAR.MONTH-Linux-x86_64.sh&lt;br /&gt;
./Anaconda3-YEAR.MONTH-Linux-x86_64.sh -s -b -p /cm/shared/apps/SHARED/my_conda_env &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working conda environment in this folder. You can manipulate this here by running &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/my_conda_env/bin/conda&amp;lt;/code&amp;gt;, or, I would recommend creating a modulefile so that you can use it as default.&lt;br /&gt;
&lt;br /&gt;
Create the following example modulefile in a matching &amp;lt;code&amp;gt;/cm/shared/modulefiles/SHARED/my_conda_env&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#%Module -*- tcl -*-&lt;br /&gt;
##&lt;br /&gt;
## conda environment modulefile&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
set                     loadedmodules           [split $::env(LOADEDMODULES) &amp;quot;:&amp;quot;]&lt;br /&gt;
set                     modulepath              [split $ModulesCurrentModulefile &amp;quot;/&amp;quot;]&lt;br /&gt;
set                     envpath                 [lrange $modulepath 4 end]&lt;br /&gt;
&lt;br /&gt;
set                     root                    /cm/shared/apps/[join $envpath &amp;quot;/&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
proc ModulesHelp { } {&lt;br /&gt;
        global version&lt;br /&gt;
&lt;br /&gt;
        puts stderr &amp;quot;\tThis module provides the conda environment at $envpath&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if { [module-info mode] != &amp;quot;whatis&amp;quot; } {&lt;br /&gt;
        puts stderr &amp;quot;[module-info mode] environent $envpath .&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
module-whatis   &amp;quot;Provides environment $envpath&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
prepend-path            PATH                    $root/bin&lt;br /&gt;
prepend-path            LD_LIBRARY_PATH         $root/lib&lt;br /&gt;
prepend-path            LIBRARY_PATH            $root/lib&lt;br /&gt;
prepend-path            CPATH                   $root/include&lt;br /&gt;
prepend-path            MANPATH                 $root/share/man&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to &amp;lt;code&amp;gt;module load SHARED/my_conda_env&amp;lt;/code&amp;gt; and thus have &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; pathed to the currently active environment.&lt;br /&gt;
&lt;br /&gt;
== Jupyter Kernel ==&lt;br /&gt;
&lt;br /&gt;
In order for students to be able to use this environment in jupyter, they will need a kernel definition.&lt;br /&gt;
&lt;br /&gt;
Kernel definitions are usually a separate folder containing, in particular, a file called &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt;, plus an icon that is displayed that represents this kernel, and other helper code.&lt;br /&gt;
&lt;br /&gt;
The setup for this is that you should create the following folder for their access:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir -p /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This folder is something they will need to copy in place to their home directory, specifically &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside this folder, create the following &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file. Watch out that the paths will need to match the current environment path if you&#039;re using a different location!&lt;br /&gt;
&lt;br /&gt;
=== Python Kernel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;PATH&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/python&amp;quot;,&lt;br /&gt;
  &amp;quot;-m&amp;quot;,&lt;br /&gt;
  &amp;quot;ipykernel&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;my_conda_env&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Python, that&#039;s it. Ipykernel is installed automatically on conda initialisation.&lt;br /&gt;
&lt;br /&gt;
=== R Kernel ===&lt;br /&gt;
&lt;br /&gt;
For an R kernel, you need to make sure that the IRkernel package is installed. This is the package that is used to communicate from Jupyter to your running R kernel.&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#MISSING EXAMPLE CODE&lt;br /&gt;
#PROBABLY /cm/shared/apps/SHARED/my_conda_env/bin/conda install R_irkernel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to create two files: &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt;. the &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt; is a helper script to allow jupyter to communicate to R effectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;LD_LIBRARY_PATH&amp;quot;:&lt;br /&gt;
      &amp;quot;/cm/shared/apps/SHARED/my_conda_env/lib:/cm/shared/apps/SHARED/my_conda_env/lib64&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
  &amp;quot;argv&amp;quot;: [&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/R&amp;quot;, &amp;quot;--slave&amp;quot;, &amp;quot;-e&amp;quot;, &amp;quot;IRkernel::main()&amp;quot;, &amp;quot;--args&amp;quot;, &amp;quot;{connection_file}&amp;quot;],&lt;br /&gt;
  &amp;quot;display_name&amp;quot;: &amp;quot;MAE50806-AdvMolEcol/Sandbox_R&amp;quot;,&lt;br /&gt;
  &amp;quot;language&amp;quot;: &amp;quot;R&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.js&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
const cmd_key = /Mac/.test(navigator.platform) ? &#039;Cmd&#039; : &#039;Ctrl&#039;&lt;br /&gt;
&lt;br /&gt;
const edit_actions = [&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Assign&#039;,&lt;br /&gt;
		shortcut: &#039;Alt--&#039;,&lt;br /&gt;
		icon: &#039;fa-long-arrow-left&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the left-assign operator (&amp;lt;-)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; &amp;lt;- &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Pipe&#039;,&lt;br /&gt;
		shortcut: `Shift-${cmd_key}-M`,&lt;br /&gt;
		icon: &#039;fa-angle-right&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the magrittr pipe operator (%&amp;gt;%)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; %&amp;gt;% &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Help&#039;,&lt;br /&gt;
		shortcut: &#039;F1&#039;,&lt;br /&gt;
		icon: &#039;fa-book&#039;,&lt;br /&gt;
		help: &#039;R: Shows the manpage for the item under the cursor&#039;,&lt;br /&gt;
		handler(cm, cell) {&lt;br /&gt;
			const {anchor, head} = cm.findWordAt(cm.getCursor())&lt;br /&gt;
			const word = cm.getRange(anchor, head)&lt;br /&gt;
			&lt;br /&gt;
			const callbacks = cell.get_callbacks()&lt;br /&gt;
			const options = {silent: false, store_history: false, stop_on_error: true}&lt;br /&gt;
			cell.last_msg_id = cell.notebook.kernel.execute(`help(\`${word}\`)`, callbacks, options)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
const prefix = &#039;irkernel&#039;&lt;br /&gt;
&lt;br /&gt;
function add_edit_shortcut(notebook, actions, keyboard_manager, edit_action) {&lt;br /&gt;
	const {name, shortcut, icon, help, handler} = edit_action&lt;br /&gt;
	&lt;br /&gt;
	const action = {&lt;br /&gt;
		icon, help,&lt;br /&gt;
		help_index : &#039;zz&#039;,&lt;br /&gt;
		handler: () =&amp;gt; {&lt;br /&gt;
			const cell = notebook.get_selected_cell()&lt;br /&gt;
			handler(cell.code_mirror, cell)&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	const full_name = actions.register(action, name, prefix)&lt;br /&gt;
	&lt;br /&gt;
	Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(shortcut, full_name)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function render_math(pager, html) {&lt;br /&gt;
	if (!html) return&lt;br /&gt;
	const $container = pager.pager_element.find(&#039;#pager-container&#039;)&lt;br /&gt;
	$container.find(&#039;p[style=&amp;quot;text-align: center;&amp;quot;]&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\[${e.querySelector(&#039;i&#039;).innerHTML}\\]`)&lt;br /&gt;
	$container.find(&#039;i&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\(${e.innerHTML}\\)`)&lt;br /&gt;
	MathJax.Hub.Queue([&#039;Typeset&#039;, MathJax.Hub, $container[0]])&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define([&#039;base/js/namespace&#039;], ({&lt;br /&gt;
	notebook,&lt;br /&gt;
	actions,&lt;br /&gt;
	keyboard_manager,&lt;br /&gt;
	pager,&lt;br /&gt;
}) =&amp;gt; ({&lt;br /&gt;
	onload() {&lt;br /&gt;
		edit_actions.forEach(a =&amp;gt; add_edit_shortcut(notebook, actions, keyboard_manager, a))&lt;br /&gt;
		&lt;br /&gt;
		pager.events.on(&#039;open_with_text.Pager&#039;, (event, {data: {&#039;text/html&#039;: html}}) =&amp;gt;&lt;br /&gt;
			render_math(pager, html))&lt;br /&gt;
	},&lt;br /&gt;
}))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Last Steps ==&lt;br /&gt;
&lt;br /&gt;
In order to help your students get their kernel definitions into &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, it&#039;s probably a good idea to write a small and simple notebook to do this when executed, or else instruct them to do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
cp -rv /cm/shared/apps/SHARED/my_conda_env/kernel/* .local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maas036</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2079</id>
		<title>Conda for teaching</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2079"/>
		<updated>2020-05-27T10:00:06Z</updated>

		<summary type="html">&lt;p&gt;Maas036: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You are going to give a teaching course, and you need a specific code environment.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
First - find a good location that everyone can read (and not write). I&#039;d suggest somewhere under &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/&amp;lt;/code&amp;gt; as a starting point - this allows everyone to access this location. It&#039;s important not to put anything secret there - it&#039;s a public resource, so please bear that in mind.&lt;br /&gt;
&lt;br /&gt;
Next - create a folder for your environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You may want to manipulate the permissions for this folder if someone is going to set this up with you. Consider the commands in [[Shared folders]].&lt;br /&gt;
&lt;br /&gt;
Then, install Anaconda into it (choose the year and month yourself!):&lt;br /&gt;
Also, note that you need to make the sh script executable before you can run it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
wget https://repo.anaconda.com/archive/Anaconda3-YEAR.MONTH-Linux-x86_64.sh&lt;br /&gt;
./Anaconda3-YEAR.MONTH-Linux-x86_64.sh -s -b -p /cm/shared/apps/SHARED/my_conda_env &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working conda environment in this folder. You can manipulate this here by running &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/my_conda_env/bin/conda&amp;lt;/code&amp;gt;, or, I would recommend creating a modulefile so that you can use it as default.&lt;br /&gt;
&lt;br /&gt;
Create the following example modulefile in a matching &amp;lt;code&amp;gt;/cm/shared/modulefiles/SHARED/my_conda_env&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#%Module -*- tcl -*-&lt;br /&gt;
##&lt;br /&gt;
## conda environment modulefile&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
set                     loadedmodules           [split $::env(LOADEDMODULES) &amp;quot;:&amp;quot;]&lt;br /&gt;
set                     modulepath              [split $ModulesCurrentModulefile &amp;quot;/&amp;quot;]&lt;br /&gt;
set                     envpath                 [lrange $modulepath 4 end]&lt;br /&gt;
&lt;br /&gt;
set                     root                    /cm/shared/apps/[join $envpath &amp;quot;/&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
proc ModulesHelp { } {&lt;br /&gt;
        global version&lt;br /&gt;
&lt;br /&gt;
        puts stderr &amp;quot;\tThis module provides the conda environment at $envpath&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if { [module-info mode] != &amp;quot;whatis&amp;quot; } {&lt;br /&gt;
        puts stderr &amp;quot;[module-info mode] environent $envpath .&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
module-whatis   &amp;quot;Provides environment $envpath&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
prepend-path            PATH                    $root/bin&lt;br /&gt;
prepend-path            LD_LIBRARY_PATH         $root/lib&lt;br /&gt;
prepend-path            LIBRARY_PATH            $root/lib&lt;br /&gt;
prepend-path            CPATH                   $root/include&lt;br /&gt;
prepend-path            MANPATH                 $root/share/man&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to &amp;lt;code&amp;gt;module load SHARED/my_conda_env&amp;lt;/code&amp;gt; and thus have &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; pathed to the currently active environment.&lt;br /&gt;
&lt;br /&gt;
== Jupyter Kernel ==&lt;br /&gt;
&lt;br /&gt;
In order for students to be able to use this environment in jupyter, they will need a kernel definition.&lt;br /&gt;
&lt;br /&gt;
Kernel definitions are usually a separate folder containing, in particular, a file called &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt;, plus an icon that is displayed that represents this kernel, and other helper code.&lt;br /&gt;
&lt;br /&gt;
The setup for this is that you should create the following folder for their access:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir -p /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This folder is something they will need to copy in place to their home directory, specifically &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside this folder, create the following &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file. Watch out that the paths will need to match the current environment path if you&#039;re using a different location!&lt;br /&gt;
&lt;br /&gt;
=== Python Kernel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;PATH&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/python&amp;quot;,&lt;br /&gt;
  &amp;quot;-m&amp;quot;,&lt;br /&gt;
  &amp;quot;ipykernel&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;my_conda_env&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Python, that&#039;s it. Ipykernel is installed automatically on conda initialisation.&lt;br /&gt;
&lt;br /&gt;
=== R Kernel ===&lt;br /&gt;
&lt;br /&gt;
For an R kernel, you need to make sure that the IRkernel package is installed. This is the package that is used to communicate from Jupyter to your running R kernel.&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#MISSING EXAMPLE CODE&lt;br /&gt;
#PROBABLY /cm/shared/apps/SHARED/my_conda_env/bin/conda install R_irkernel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to create two files: &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt;. the &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt; is a helper script to allow jupyter to communicate to R effectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;LD_LIBRARY_PATH&amp;quot;:&lt;br /&gt;
      &amp;quot;/cm/shared/apps/SHARED/my_conda_env/lib:/cm/shared/apps/SHARED/my_conda_env/lib64&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
  &amp;quot;argv&amp;quot;: [&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/R&amp;quot;, &amp;quot;--slave&amp;quot;, &amp;quot;-e&amp;quot;, &amp;quot;IRkernel::main()&amp;quot;, &amp;quot;--args&amp;quot;, &amp;quot;{connection_file}&amp;quot;],&lt;br /&gt;
  &amp;quot;display_name&amp;quot;: &amp;quot;MAE50806-AdvMolEcol/Sandbox_R&amp;quot;,&lt;br /&gt;
  &amp;quot;language&amp;quot;: &amp;quot;R&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.js&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
const cmd_key = /Mac/.test(navigator.platform) ? &#039;Cmd&#039; : &#039;Ctrl&#039;&lt;br /&gt;
&lt;br /&gt;
const edit_actions = [&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Assign&#039;,&lt;br /&gt;
		shortcut: &#039;Alt--&#039;,&lt;br /&gt;
		icon: &#039;fa-long-arrow-left&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the left-assign operator (&amp;lt;-)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; &amp;lt;- &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Pipe&#039;,&lt;br /&gt;
		shortcut: `Shift-${cmd_key}-M`,&lt;br /&gt;
		icon: &#039;fa-angle-right&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the magrittr pipe operator (%&amp;gt;%)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; %&amp;gt;% &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Help&#039;,&lt;br /&gt;
		shortcut: &#039;F1&#039;,&lt;br /&gt;
		icon: &#039;fa-book&#039;,&lt;br /&gt;
		help: &#039;R: Shows the manpage for the item under the cursor&#039;,&lt;br /&gt;
		handler(cm, cell) {&lt;br /&gt;
			const {anchor, head} = cm.findWordAt(cm.getCursor())&lt;br /&gt;
			const word = cm.getRange(anchor, head)&lt;br /&gt;
			&lt;br /&gt;
			const callbacks = cell.get_callbacks()&lt;br /&gt;
			const options = {silent: false, store_history: false, stop_on_error: true}&lt;br /&gt;
			cell.last_msg_id = cell.notebook.kernel.execute(`help(\`${word}\`)`, callbacks, options)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
const prefix = &#039;irkernel&#039;&lt;br /&gt;
&lt;br /&gt;
function add_edit_shortcut(notebook, actions, keyboard_manager, edit_action) {&lt;br /&gt;
	const {name, shortcut, icon, help, handler} = edit_action&lt;br /&gt;
	&lt;br /&gt;
	const action = {&lt;br /&gt;
		icon, help,&lt;br /&gt;
		help_index : &#039;zz&#039;,&lt;br /&gt;
		handler: () =&amp;gt; {&lt;br /&gt;
			const cell = notebook.get_selected_cell()&lt;br /&gt;
			handler(cell.code_mirror, cell)&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	const full_name = actions.register(action, name, prefix)&lt;br /&gt;
	&lt;br /&gt;
	Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(shortcut, full_name)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function render_math(pager, html) {&lt;br /&gt;
	if (!html) return&lt;br /&gt;
	const $container = pager.pager_element.find(&#039;#pager-container&#039;)&lt;br /&gt;
	$container.find(&#039;p[style=&amp;quot;text-align: center;&amp;quot;]&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\[${e.querySelector(&#039;i&#039;).innerHTML}\\]`)&lt;br /&gt;
	$container.find(&#039;i&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\(${e.innerHTML}\\)`)&lt;br /&gt;
	MathJax.Hub.Queue([&#039;Typeset&#039;, MathJax.Hub, $container[0]])&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define([&#039;base/js/namespace&#039;], ({&lt;br /&gt;
	notebook,&lt;br /&gt;
	actions,&lt;br /&gt;
	keyboard_manager,&lt;br /&gt;
	pager,&lt;br /&gt;
}) =&amp;gt; ({&lt;br /&gt;
	onload() {&lt;br /&gt;
		edit_actions.forEach(a =&amp;gt; add_edit_shortcut(notebook, actions, keyboard_manager, a))&lt;br /&gt;
		&lt;br /&gt;
		pager.events.on(&#039;open_with_text.Pager&#039;, (event, {data: {&#039;text/html&#039;: html}}) =&amp;gt;&lt;br /&gt;
			render_math(pager, html))&lt;br /&gt;
	},&lt;br /&gt;
}))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Last Steps ==&lt;br /&gt;
&lt;br /&gt;
In order to help your students get their kernel definitions into &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, it&#039;s probably a good idea to write a small and simple notebook to do this when executed, or else instruct them to do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
cp -rv /cm/shared/apps/SHARED/my_conda_env/kernel/* .local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maas036</name></author>
	</entry>
	<entry>
		<id>https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2078</id>
		<title>Conda for teaching</title>
		<link rel="alternate" type="text/html" href="https://wiki.anunna.wur.nl/index.php?title=Conda_for_teaching&amp;diff=2078"/>
		<updated>2020-05-27T09:32:17Z</updated>

		<summary type="html">&lt;p&gt;Maas036: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You are going to give a teaching course, and you need a specific code environment.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
First - find a good location that everyone can read (and not write). I&#039;d suggest somewhere under &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/&amp;lt;/code&amp;gt; as a starting point - this allows everyone to access this location. It&#039;s important not to put anything secret there - it&#039;s a public resource, so please bear that in mind.&lt;br /&gt;
&lt;br /&gt;
Next - create a folder for your environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You may want to manipulate the permissions for this folder if someone is going to set this up with you. Consider the commands in [[Shared folders]].&lt;br /&gt;
&lt;br /&gt;
Then, install Anaconda into it (choose the year and month yourself!):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
wget https://repo.anaconda.com/archive/Anaconda3-YEAR.MONTH-Linux-x86_64.sh&lt;br /&gt;
./Anaconda3-YEAR.MONTH-Linux-x86_64.sh -s -b -p /cm/shared/apps/SHARED/my_conda_env &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working conda environment in this folder. You can manipulate this here by running &amp;lt;code&amp;gt;/cm/shared/apps/SHARED/my_conda_env/bin/conda&amp;lt;/code&amp;gt;, or, I would recommend creating a modulefile so that you can use it as default.&lt;br /&gt;
&lt;br /&gt;
Create the following example modulefile in a matching &amp;lt;code&amp;gt;/cm/shared/modulefiles/SHARED/my_conda_env&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#%Module -*- tcl -*-&lt;br /&gt;
##&lt;br /&gt;
## conda environment modulefile&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
set                     loadedmodules           [split $::env(LOADEDMODULES) &amp;quot;:&amp;quot;]&lt;br /&gt;
set                     modulepath              [split $ModulesCurrentModulefile &amp;quot;/&amp;quot;]&lt;br /&gt;
set                     envpath                 [lrange $modulepath 4 end]&lt;br /&gt;
&lt;br /&gt;
set                     root                    /cm/shared/apps/[join $envpath &amp;quot;/&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
proc ModulesHelp { } {&lt;br /&gt;
        global version&lt;br /&gt;
&lt;br /&gt;
        puts stderr &amp;quot;\tThis module provides the conda environment at $envpath&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if { [module-info mode] != &amp;quot;whatis&amp;quot; } {&lt;br /&gt;
        puts stderr &amp;quot;[module-info mode] environent $envpath .&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
module-whatis   &amp;quot;Provides environment $envpath&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
prepend-path            PATH                    $root/bin&lt;br /&gt;
prepend-path            LD_LIBRARY_PATH         $root/lib&lt;br /&gt;
prepend-path            LIBRARY_PATH            $root/lib&lt;br /&gt;
prepend-path            CPATH                   $root/include&lt;br /&gt;
prepend-path            MANPATH                 $root/share/man&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to &amp;lt;code&amp;gt;module load SHARED/my_conda_env&amp;lt;/code&amp;gt; and thus have &amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt; pathed to the currently active environment.&lt;br /&gt;
&lt;br /&gt;
== Jupyter Kernel ==&lt;br /&gt;
&lt;br /&gt;
In order for students to be able to use this environment in jupyter, they will need a kernel definition.&lt;br /&gt;
&lt;br /&gt;
Kernel definitions are usually a separate folder containing, in particular, a file called &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt;, plus an icon that is displayed that represents this kernel, and other helper code.&lt;br /&gt;
&lt;br /&gt;
The setup for this is that you should create the following folder for their access:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
mkdir -p /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
chmod +r /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This folder is something they will need to copy in place to their home directory, specifically &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside this folder, create the following &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; file. Watch out that the paths will need to match the current environment path if you&#039;re using a different location!&lt;br /&gt;
&lt;br /&gt;
=== Python Kernel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;PATH&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
 &amp;quot;language&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
 &amp;quot;argv&amp;quot;: [&lt;br /&gt;
  &amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/python&amp;quot;,&lt;br /&gt;
  &amp;quot;-m&amp;quot;,&lt;br /&gt;
  &amp;quot;ipykernel&amp;quot;,&lt;br /&gt;
  &amp;quot;-f&amp;quot;,&lt;br /&gt;
  &amp;quot;{connection_file}&amp;quot;&lt;br /&gt;
 ],&lt;br /&gt;
 &amp;quot;display_name&amp;quot;: &amp;quot;my_conda_env&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Python, that&#039;s it. Ipykernel is installed automatically on conda initialisation.&lt;br /&gt;
&lt;br /&gt;
=== R Kernel ===&lt;br /&gt;
&lt;br /&gt;
For an R kernel, you need to make sure that the IRkernel package is installed. This is the package that is used to communicate from Jupyter to your running R kernel.&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
#MISSING EXAMPLE CODE&lt;br /&gt;
#PROBABLY /cm/shared/apps/SHARED/my_conda_env/bin/conda install R_irkernel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll also need to create two files: &amp;lt;code&amp;gt;kernel.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt;. the &amp;lt;code&amp;gt;kernel.js&amp;lt;/code&amp;gt; is a helper script to allow jupyter to communicate to R effectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;LD_LIBRARY_PATH&amp;quot;:&lt;br /&gt;
      &amp;quot;/cm/shared/apps/SHARED/my_conda_env/lib:/cm/shared/apps/SHARED/my_conda_env/lib64&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
  &amp;quot;argv&amp;quot;: [&amp;quot;/cm/shared/apps/SHARED/my_conda_env/bin/R&amp;quot;, &amp;quot;--slave&amp;quot;, &amp;quot;-e&amp;quot;, &amp;quot;IRkernel::main()&amp;quot;, &amp;quot;--args&amp;quot;, &amp;quot;{connection_file}&amp;quot;],&lt;br /&gt;
  &amp;quot;display_name&amp;quot;: &amp;quot;MAE50806-AdvMolEcol/Sandbox_R&amp;quot;,&lt;br /&gt;
  &amp;quot;language&amp;quot;: &amp;quot;R&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
vim /cm/shared/apps/SHARED/my_conda_env/kernel/my_conda_env/kernel.js&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
const cmd_key = /Mac/.test(navigator.platform) ? &#039;Cmd&#039; : &#039;Ctrl&#039;&lt;br /&gt;
&lt;br /&gt;
const edit_actions = [&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Assign&#039;,&lt;br /&gt;
		shortcut: &#039;Alt--&#039;,&lt;br /&gt;
		icon: &#039;fa-long-arrow-left&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the left-assign operator (&amp;lt;-)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; &amp;lt;- &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Pipe&#039;,&lt;br /&gt;
		shortcut: `Shift-${cmd_key}-M`,&lt;br /&gt;
		icon: &#039;fa-angle-right&#039;,&lt;br /&gt;
		help: &#039;R: Inserts the magrittr pipe operator (%&amp;gt;%)&#039;,&lt;br /&gt;
		handler(cm) {&lt;br /&gt;
			cm.replaceSelection(&#039; %&amp;gt;% &#039;)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		name: &#039;R Help&#039;,&lt;br /&gt;
		shortcut: &#039;F1&#039;,&lt;br /&gt;
		icon: &#039;fa-book&#039;,&lt;br /&gt;
		help: &#039;R: Shows the manpage for the item under the cursor&#039;,&lt;br /&gt;
		handler(cm, cell) {&lt;br /&gt;
			const {anchor, head} = cm.findWordAt(cm.getCursor())&lt;br /&gt;
			const word = cm.getRange(anchor, head)&lt;br /&gt;
			&lt;br /&gt;
			const callbacks = cell.get_callbacks()&lt;br /&gt;
			const options = {silent: false, store_history: false, stop_on_error: true}&lt;br /&gt;
			cell.last_msg_id = cell.notebook.kernel.execute(`help(\`${word}\`)`, callbacks, options)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
const prefix = &#039;irkernel&#039;&lt;br /&gt;
&lt;br /&gt;
function add_edit_shortcut(notebook, actions, keyboard_manager, edit_action) {&lt;br /&gt;
	const {name, shortcut, icon, help, handler} = edit_action&lt;br /&gt;
	&lt;br /&gt;
	const action = {&lt;br /&gt;
		icon, help,&lt;br /&gt;
		help_index : &#039;zz&#039;,&lt;br /&gt;
		handler: () =&amp;gt; {&lt;br /&gt;
			const cell = notebook.get_selected_cell()&lt;br /&gt;
			handler(cell.code_mirror, cell)&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	const full_name = actions.register(action, name, prefix)&lt;br /&gt;
	&lt;br /&gt;
	Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(shortcut, full_name)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function render_math(pager, html) {&lt;br /&gt;
	if (!html) return&lt;br /&gt;
	const $container = pager.pager_element.find(&#039;#pager-container&#039;)&lt;br /&gt;
	$container.find(&#039;p[style=&amp;quot;text-align: center;&amp;quot;]&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\[${e.querySelector(&#039;i&#039;).innerHTML}\\]`)&lt;br /&gt;
	$container.find(&#039;i&#039;).map((i, e) =&amp;gt;&lt;br /&gt;
		e.outerHTML = `\\(${e.innerHTML}\\)`)&lt;br /&gt;
	MathJax.Hub.Queue([&#039;Typeset&#039;, MathJax.Hub, $container[0]])&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define([&#039;base/js/namespace&#039;], ({&lt;br /&gt;
	notebook,&lt;br /&gt;
	actions,&lt;br /&gt;
	keyboard_manager,&lt;br /&gt;
	pager,&lt;br /&gt;
}) =&amp;gt; ({&lt;br /&gt;
	onload() {&lt;br /&gt;
		edit_actions.forEach(a =&amp;gt; add_edit_shortcut(notebook, actions, keyboard_manager, a))&lt;br /&gt;
		&lt;br /&gt;
		pager.events.on(&#039;open_with_text.Pager&#039;, (event, {data: {&#039;text/html&#039;: html}}) =&amp;gt;&lt;br /&gt;
			render_math(pager, html))&lt;br /&gt;
	},&lt;br /&gt;
}))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Last Steps ==&lt;br /&gt;
&lt;br /&gt;
In order to help your students get their kernel definitions into &amp;lt;code&amp;gt;$HOME/.local/share/jupyter/kernels/&amp;lt;/code&amp;gt;, it&#039;s probably a good idea to write a small and simple notebook to do this when executed, or else instruct them to do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
cp -rv /cm/shared/apps/SHARED/my_conda_env/kernel/* .local/share/jupyter/kernels/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maas036</name></author>
	</entry>
</feed>