Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Draft Forbes Group Website (Build by Nikola). The official site is hosted at:

https://labs.wsu.edu/forbes

5910 views
License: GPL3
ubuntu2004
1
<?xml version="1.0" encoding="utf-8"?>
2
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>The Forbes Group (Posts about notes)</title><link>http://swan.physics.wsu.edu/forbes/</link><description></description><atom:link href="http://swan.physics.wsu.edu/forbes/categories/cat_notes.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2023 &lt;a href="mailto:Michael McNeil Forbes &lt;[email protected]&gt;"&gt;Michael McNeil Forbes&lt;/a&gt; </copyright><lastBuildDate>Wed, 15 Mar 2023 01:00:14 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Nikola Website</title><link>http://swan.physics.wsu.edu/forbes/public/notes/nikola-website/</link><dc:creator>Michael McNeil Forbes</dc:creator><description>&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
3
&lt;/div&gt;&lt;div class="inner_cell"&gt;
4
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
5
&lt;h2 id="Nikola-for-Websites"&gt;Nikola for Websites&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-website/#Nikola-for-Websites"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In this post we describe how to we use Nikola for hosting research websites. Note: this is not a comprehensive discussion of Nikola's features but a streamlined explanation of the assumptions we make for simplified organization.&lt;/p&gt;
6
&lt;p&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-website/"&gt;Read more…&lt;/a&gt; (1 min remaining to read)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><guid>http://swan.physics.wsu.edu/forbes/public/notes/nikola-website/</guid><pubDate>Thu, 12 Jul 2018 06:02:43 GMT</pubDate></item><item><title>CoCalc Workflow (formerly Sage Mathcloud)</title><link>http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/</link><dc:creator>Michael McNeil Forbes</dc:creator><description>&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
7
&lt;/div&gt;&lt;div class="inner_cell"&gt;
8
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
9
&lt;p&gt;We describe various strategies for working with &lt;a href="https://cocalc.com"&gt;CoCalc&lt;/a&gt; including version control, collaboration, and using Dropbox.&lt;/p&gt;
10
&lt;!-- END TEASER --&gt;
11
&lt;p&gt;&lt;em&gt;Note: In some places, such as my aliases, I still use the acronym SMC which refers to Sage Mathcloud – the previous name for CoCalc.&lt;/em&gt;&lt;/p&gt;
12
13
&lt;/div&gt;
14
&lt;/div&gt;
15
&lt;/div&gt;
16
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
17
&lt;/div&gt;&lt;div class="inner_cell"&gt;
18
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
19
&lt;h2&gt;Table of Contents&lt;span class="tocSkip"&gt;&lt;/span&gt;&lt;/h2&gt;
20
&lt;div class="toc"&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#TL;DR" data-toc-modified-id="TL;DR-1"&gt;&lt;span class="toc-item-num"&gt;1  &lt;/span&gt;TL;DR&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Setup" data-toc-modified-id="Setup-2"&gt;&lt;span class="toc-item-num"&gt;2  &lt;/span&gt;Setup&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Custom-Environments" data-toc-modified-id="Custom-Environments-3"&gt;&lt;span class="toc-item-num"&gt;3  &lt;/span&gt;Custom Environments&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#TL;DR:" data-toc-modified-id="TL;DR:-3.1"&gt;&lt;span class="toc-item-num"&gt;3.1  &lt;/span&gt;TL;DR:&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#MayaVi" data-toc-modified-id="MayaVi-3.2"&gt;&lt;span class="toc-item-num"&gt;3.2  &lt;/span&gt;MayaVi&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#System-Software" data-toc-modified-id="System-Software-4"&gt;&lt;span class="toc-item-num"&gt;4  &lt;/span&gt;System Software&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Synchronization" data-toc-modified-id="Synchronization-5"&gt;&lt;span class="toc-item-num"&gt;5  &lt;/span&gt;Synchronization&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#MathJaX" data-toc-modified-id="MathJaX-6"&gt;&lt;span class="toc-item-num"&gt;6  &lt;/span&gt;MathJaX&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#RClone-for-Google-Drive-etc." data-toc-modified-id="RClone-for-Google-Drive-etc.-7"&gt;&lt;span class="toc-item-num"&gt;7  &lt;/span&gt;RClone for Google Drive etc.&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Notebook-Extensions" data-toc-modified-id="Notebook-Extensions-8"&gt;&lt;span class="toc-item-num"&gt;8  &lt;/span&gt;Notebook Extensions&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#(Old-Procedure:-Not-Needed-Anymore)" data-toc-modified-id="(Old-Procedure:-Not-Needed-Anymore)-8.1"&gt;&lt;span class="toc-item-num"&gt;8.1  &lt;/span&gt;(Old Procedure: Not Needed Anymore)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Raw-File-Access" data-toc-modified-id="Raw-File-Access-9"&gt;&lt;span class="toc-item-num"&gt;9  &lt;/span&gt;Raw File Access&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Configuration-Files" data-toc-modified-id="Configuration-Files-10"&gt;&lt;span class="toc-item-num"&gt;10  &lt;/span&gt;Configuration Files&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Your-Computer" data-toc-modified-id="Your-Computer-10.1"&gt;&lt;span class="toc-item-num"&gt;10.1  &lt;/span&gt;Your Computer&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.bashrc" data-toc-modified-id="~/.bashrc-10.1.1"&gt;&lt;span class="toc-item-num"&gt;10.1.1  &lt;/span&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.ssh/config" data-toc-modified-id="~/.ssh/config-10.1.2"&gt;&lt;span class="toc-item-num"&gt;10.1.2  &lt;/span&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#CoCalc-Project" data-toc-modified-id="CoCalc-Project-10.2"&gt;&lt;span class="toc-item-num"&gt;10.2  &lt;/span&gt;CoCalc Project&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.bash_alias" data-toc-modified-id="~/.bash_alias-10.2.1"&gt;&lt;span class="toc-item-num"&gt;10.2.1  &lt;/span&gt;&lt;code&gt;~/.bash_alias&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.inputrc" data-toc-modified-id="~/.inputrc-10.2.2"&gt;&lt;span class="toc-item-num"&gt;10.2.2  &lt;/span&gt;&lt;code&gt;~/.inputrc&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.hgrc" data-toc-modified-id="~/.hgrc-10.2.3"&gt;&lt;span class="toc-item-num"&gt;10.2.3  &lt;/span&gt;&lt;code&gt;~/.hgrc&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.hgignore" data-toc-modified-id="~/.hgignore-10.2.4"&gt;&lt;span class="toc-item-num"&gt;10.2.4  &lt;/span&gt;&lt;code&gt;~/.hgignore&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.gitconfig" data-toc-modified-id="~/.gitconfig-10.2.5"&gt;&lt;span class="toc-item-num"&gt;10.2.5  &lt;/span&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.mrconfig" data-toc-modified-id="~/.mrconfig-10.2.6"&gt;&lt;span class="toc-item-num"&gt;10.2.6  &lt;/span&gt;&lt;code&gt;~/.mrconfig&lt;/code&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#References" data-toc-modified-id="References-11"&gt;&lt;span class="toc-item-num"&gt;11  &lt;/span&gt;References&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Old-Information-(Out-of-Data)" data-toc-modified-id="Old-Information-(Out-of-Data)-12"&gt;&lt;span class="toc-item-num"&gt;12  &lt;/span&gt;Old Information (Out of Data)&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-no-longer-works!" data-toc-modified-id="Dropbox-no-longer-works!-12.1"&gt;&lt;span class="toc-item-num"&gt;12.1  &lt;/span&gt;Dropbox &lt;/a&gt;&lt;a href="https://github.com/sagemathinc/cocalc/issues/11" target="_blank"&gt;no longer works!&lt;/a&gt;&lt;/span&gt;&lt;ul class="toc-item"&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-and-Version-Control" data-toc-modified-id="Dropbox-and-Version-Control-12.1.1"&gt;&lt;span class="toc-item-num"&gt;12.1.1  &lt;/span&gt;Dropbox and Version Control&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-Issues" data-toc-modified-id="Dropbox-Issues-12.1.2"&gt;&lt;span class="toc-item-num"&gt;12.1.2  &lt;/span&gt;Dropbox Issues&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
21
22
&lt;/div&gt;
23
&lt;/div&gt;
24
&lt;/div&gt;
25
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
26
&lt;/div&gt;&lt;div class="inner_cell"&gt;
27
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
28
&lt;h2 id="TL;DR"&gt;TL;DR&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#TL;DR"&gt;&lt;/a&gt;&lt;/h2&gt;
29
&lt;/div&gt;
30
&lt;/div&gt;
31
&lt;/div&gt;
32
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
33
&lt;/div&gt;&lt;div class="inner_cell"&gt;
34
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
35
&lt;ol&gt;
36
&lt;li&gt;Setup your local computer (once) as discussed below.&lt;/li&gt;
37
&lt;li&gt;Create a CoCalc project, add network access etc., and add your ssh key, and create an alias on your local computer for convenience.&lt;/li&gt;
38
&lt;li&gt;SSH to your CoCalc project and then do something like this:&lt;/li&gt;
39
&lt;/ol&gt;
40
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;smcbec&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Or whatever you called your alias&lt;/span&gt;
41
42
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Do this in the top level of your cocalc project.&lt;/span&gt;
43
44
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.hgrc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
45
&lt;span class="s"&gt;[ui]&lt;/span&gt;
46
&lt;span class="s"&gt;username = \$LC_HG_USERNAME&lt;/span&gt;
47
&lt;span class="s"&gt;merge = emacs&lt;/span&gt;
48
&lt;span class="s"&gt;paginate = never&lt;/span&gt;
49
50
&lt;span class="s"&gt;[extensions]&lt;/span&gt;
51
&lt;span class="s"&gt;# Builtin extensions:&lt;/span&gt;
52
&lt;span class="s"&gt;rebase=&lt;/span&gt;
53
&lt;span class="s"&gt;graphlog=&lt;/span&gt;
54
&lt;span class="s"&gt;color=&lt;/span&gt;
55
&lt;span class="s"&gt;record=&lt;/span&gt;
56
&lt;span class="s"&gt;histedit=&lt;/span&gt;
57
&lt;span class="s"&gt;shelve=&lt;/span&gt;
58
&lt;span class="s"&gt;strip=&lt;/span&gt;
59
&lt;span class="s"&gt;#extdiff =&lt;/span&gt;
60
&lt;span class="s"&gt;#mq =&lt;/span&gt;
61
&lt;span class="s"&gt;#purge =&lt;/span&gt;
62
&lt;span class="s"&gt;#transplant =&lt;/span&gt;
63
&lt;span class="s"&gt;#evolve =&lt;/span&gt;
64
&lt;span class="s"&gt;#amend =&lt;/span&gt;
65
66
&lt;span class="s"&gt;[color]&lt;/span&gt;
67
&lt;span class="s"&gt;custom.rev = red&lt;/span&gt;
68
&lt;span class="s"&gt;custom.author = blue&lt;/span&gt;
69
&lt;span class="s"&gt;custom.date = green&lt;/span&gt;
70
&lt;span class="s"&gt;custom.branches = red&lt;/span&gt;
71
72
&lt;span class="s"&gt;[merge-tools]&lt;/span&gt;
73
&lt;span class="s"&gt;emacs.args = -q --eval "(ediff-merge-with-ancestor \""$local"\" \""$other"\" \""$base"\" nil \""$output"\")"&lt;/span&gt;
74
&lt;span class="s"&gt;EOF&lt;/span&gt;
75
76
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.gitconfig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
77
&lt;span class="s"&gt;[push]&lt;/span&gt;
78
&lt;span class="s"&gt; default = simple&lt;/span&gt;
79
&lt;span class="s"&gt;[alias]&lt;/span&gt;
80
&lt;span class="s"&gt; lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all&lt;/span&gt;
81
&lt;span class="s"&gt; lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all&lt;/span&gt;
82
&lt;span class="s"&gt; lg = !"git lg1"]&lt;/span&gt;
83
&lt;span class="s"&gt;EOF&lt;/span&gt;
84
85
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bash_aliases&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
86
&lt;span class="s"&gt;# Add some customizations for mercurial etc.&lt;/span&gt;
87
&lt;span class="s"&gt;. mmf_setup&lt;/span&gt;
88
89
&lt;span class="s"&gt;# Specified here since .gitconfig will not expand the variables&lt;/span&gt;
90
&lt;span class="s"&gt;git config --global user.name "\${LC_GIT_USERNAME}"&lt;/span&gt;
91
&lt;span class="s"&gt;git config --global user.email "\${LC_GIT_USEREMAIL}"&lt;/span&gt;
92
&lt;span class="s"&gt;EOF&lt;/span&gt;
93
94
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.hgignore&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
95
&lt;span class="s"&gt;syntax: glob&lt;/span&gt;
96
97
&lt;span class="s"&gt;*.sage-history&lt;/span&gt;
98
&lt;span class="s"&gt;*.sage-chat&lt;/span&gt;
99
&lt;span class="s"&gt;*.sage-jupyter&lt;/span&gt;
100
&lt;span class="s"&gt;EOF&lt;/span&gt;
101
102
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.inputrc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
103
&lt;span class="s"&gt;"\M-[A": history-search-backward&lt;/span&gt;
104
&lt;span class="s"&gt;"\e[A": history-search-backward&lt;/span&gt;
105
&lt;span class="s"&gt;"\M-[B": history-search-forward&lt;/span&gt;
106
&lt;span class="s"&gt;"\e[B": history-search-forward&lt;/span&gt;
107
&lt;span class="s"&gt;EOF&lt;/span&gt;
108
109
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.mrconfig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
110
&lt;span class="s"&gt;# myrepos (mr) Config File; -*-Shell-script-*-&lt;/span&gt;
111
&lt;span class="s"&gt;# dest = ~/.mrconfig # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
112
113
&lt;span class="s"&gt;include = cat "${MMFHG}/mrconfig"&lt;/span&gt;
114
115
&lt;span class="s"&gt;[DEFAULT]&lt;/span&gt;
116
&lt;span class="s"&gt;hg_out = hg out&lt;/span&gt;
117
&lt;span class="s"&gt;EOF&lt;/span&gt;
118
119
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;mmf_setup
120
anaconda2019
121
122
&lt;span class="c1"&gt;# Should use conda or mamba, but this needs a new&lt;/span&gt;
123
&lt;span class="c1"&gt;# environment, so we just use pip for now.&lt;/span&gt;
124
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;mmf_setup&lt;span class="w"&gt; &lt;/span&gt;mmfutils
125
126
&lt;span class="c1"&gt;# Create a work environment and associate a kernel&lt;/span&gt;
127
mamba&lt;span class="w"&gt; &lt;/span&gt;env&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;mforbes/work
128
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/
129
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/
130
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/ext/anaconda-2019.03/share/jupyter/kernels/python3&lt;span class="w"&gt; &lt;/span&gt;work-py
131
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/work-py/kernel.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
132
&lt;span class="s"&gt;# kernel.json&lt;/span&gt;
133
&lt;span class="s"&gt;{&lt;/span&gt;
134
&lt;span class="s"&gt; "argv": [&lt;/span&gt;
135
&lt;span class="s"&gt; "/home/user/.conda/envs/work/bin/python",&lt;/span&gt;
136
&lt;span class="s"&gt; "-m",&lt;/span&gt;
137
&lt;span class="s"&gt; "ipykernel_launcher",&lt;/span&gt;
138
&lt;span class="s"&gt; "-f",&lt;/span&gt;
139
&lt;span class="s"&gt; "{connection_file}"&lt;/span&gt;
140
&lt;span class="s"&gt; ],&lt;/span&gt;
141
&lt;span class="s"&gt; "display_name": "work",&lt;/span&gt;
142
&lt;span class="s"&gt; "language": "python"&lt;/span&gt;
143
&lt;span class="s"&gt;}&lt;/span&gt;
144
&lt;span class="s"&gt;EOF&lt;/span&gt;
145
146
exit-anaconda
147
148
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/repositories
149
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;git://myrepos.branchable.com/&lt;span class="w"&gt; &lt;/span&gt;~/repositories/myrepos
150
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;~/repositories/myrepos/mr&lt;span class="w"&gt; &lt;/span&gt;~/.local/bin/
151
&lt;/pre&gt;&lt;/div&gt;
152
153
&lt;/div&gt;
154
&lt;/div&gt;
155
&lt;/div&gt;
156
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
157
&lt;/div&gt;&lt;div class="inner_cell"&gt;
158
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
159
&lt;h2 id="Setup"&gt;Setup&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Setup"&gt;&lt;/a&gt;&lt;/h2&gt;
160
&lt;/div&gt;
161
&lt;/div&gt;
162
&lt;/div&gt;
163
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
164
&lt;/div&gt;&lt;div class="inner_cell"&gt;
165
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
166
&lt;p&gt;&lt;em&gt;Knowledge: To follow these instructions you will need to understand how to work with the linux shell. If you are unfamilliar with the shell, please review the &lt;a href="http://swcarpentry.github.io/shell-novice/"&gt;shell novice&lt;/a&gt; course. For a discussion of environmental variables see &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps"&gt;how to read and set environmental and shell variables&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
167
&lt;p&gt;Prior to creating a new project I do the following &lt;strong&gt;on my local computer&lt;/strong&gt;:&lt;/p&gt;
168
&lt;ol&gt;
169
&lt;li&gt;&lt;p&gt;Set the following environment variable in one of my startup file. CoCalc automatically sources &lt;code&gt;~/.bash_aliases&lt;/code&gt; if it exists (this is specifeid in &lt;code&gt;~/.bashrc&lt;/code&gt;) so I use it.:&lt;/p&gt;
170
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ~/.bash_aliases&lt;/span&gt;
171
...
172
&lt;span class="c1"&gt;# This hack allows one to forward the environmental variables using&lt;/span&gt;
173
&lt;span class="c1"&gt;# ssh since LC_* variables are permitted by default.&lt;/span&gt;
174
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_HG_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Michael McNeil Forbes &amp;lt;[email protected]&amp;gt;"&lt;/span&gt;
175
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_GIT_USEREMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"[email protected]"&lt;/span&gt;
176
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_GIT_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Michael McNeil Forbes"&lt;/span&gt;
177
&lt;/pre&gt;&lt;/div&gt;
178
&lt;p&gt;Then in my &lt;code&gt;~/.hgrc&lt;/code&gt; file I include the following:&lt;/p&gt;
179
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ~/.hgrc&lt;/span&gt;
180
&lt;span class="k"&gt;[ui]&lt;/span&gt;
181
&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$LC_HG_USERNAME&lt;/span&gt;
182
&lt;/pre&gt;&lt;/div&gt;
183
&lt;p&gt;This way, you specify your mercurial username in only one spot - the &lt;code&gt;LC_HG_USERNAME&lt;/code&gt; environmental variable. (This is the &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; principle.)&lt;/p&gt;
184
&lt;p&gt;A similar configuration should be used if you want to use &lt;code&gt;git&lt;/code&gt; but variable expansion will &lt;a href="https://stackoverflow.com/a/11262153"&gt;not work with git&lt;/a&gt;. Instead, we need to set the user and email in the &lt;code&gt;.bash_aliases&lt;/code&gt; file with something like:&lt;/p&gt;
185
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ~/.bash_aliases&lt;/span&gt;
186
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LC_GIT_USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
187
&lt;/pre&gt;&lt;/div&gt;
188
&lt;/li&gt;
189
&lt;/ol&gt;
190
&lt;p&gt;git config --global user.name = "$LC_GIT_USEREMAIL"&lt;/p&gt;
191
&lt;pre&gt;&lt;code&gt;
192
*The reason for using a variable name staring with `LC_*` is that these variables are generally allowed by the `sshd` server so that they can be send when one uses ssh to connect to a project (see below).*
193
194
2. Find the `host` and `username` for your CoCalc project (look under the project **Settings** page under the `&amp;gt;_ SSH into your project...` section) and add these to my local ``~/.ssh/config`` file. For example: CoCalc might say to connect to `[email protected]`. This would mean I should add the following to my `~/.ssh/config` file:
195
196
```ini
197
# ~/.ssh/config
198
Host smc*
199
ForwardAgent yes
200
SendEnv LC_HG_USERNAME
201
SendEnv LC_GIT_USERNAME
202
SendEnv LC_GIT_USEREMAIL
203
204
Host smcbec
205
HostName compute5-us.sagemath.com
206
User e397631635174e21abaa7c59fa227655
207
&lt;/code&gt;&lt;/pre&gt;
208
&lt;p&gt;The &lt;code&gt;SendEnv&lt;/code&gt; instruction will then apply to all &lt;code&gt;smc*&lt;/code&gt; hosts and sends the &lt;code&gt;LC_HG_USERNAME&lt;/code&gt; environmental variable. This allows us to refer to this in the &lt;code&gt;~/.hgrc&lt;/code&gt; file so that version control commands will log based on who issues them, which is useful because CoCalc does not provide user-level authentication (only project level). Thus, if a user sends this, then mercurial can use the appropriate username. (A similar setup with git should be possible). See &lt;a href="https://github.com/sagemathinc/smc/issues/370"&gt;issue #370&lt;/a&gt; for more information.&lt;/p&gt;
209
210
&lt;/div&gt;
211
&lt;/div&gt;
212
&lt;/div&gt;
213
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
214
&lt;/div&gt;&lt;div class="inner_cell"&gt;
215
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
216
&lt;ol&gt;
217
&lt;li&gt;&lt;p&gt;Once the project has been created, I add the contents of my &lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt; to CoCalc using the web interface for SSH Keys. This allows me to login to my projects. &lt;em&gt;(On other systems, this would be the equivalent of adding it to &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;.)&lt;/em&gt;&lt;/p&gt;
218
&lt;/li&gt;
219
&lt;li&gt;&lt;p&gt;Add any resources for the project. (For example, network access simplifies installing stuff below, and using a fixed host will prevent the compute node from changing so that the alias setup in the next step will keep working. However, you must pay for these upgrades.)&lt;/p&gt;
220
&lt;/li&gt;
221
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;~/.hgrc&lt;/code&gt; file like the following:&lt;/p&gt;
222
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[ui]&lt;/span&gt;
223
&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$LC_HG_USERNAME&lt;/span&gt;
224
&lt;span class="k"&gt;[extensions]&lt;/span&gt;
225
226
&lt;span class="c1"&gt;#####################&lt;/span&gt;
227
&lt;span class="c1"&gt;# Builtin extensions:&lt;/span&gt;
228
&lt;span class="na"&gt;rebase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
229
&lt;span class="na"&gt;graphlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
230
&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
231
&lt;span class="na"&gt;record&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
232
&lt;span class="na"&gt;histedit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
233
&lt;span class="na"&gt;shelve&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
234
&lt;span class="na"&gt;strip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
235
236
&lt;span class="k"&gt;[color]&lt;/span&gt;
237
&lt;span class="na"&gt;custom.rev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;
238
&lt;span class="na"&gt;custom.author&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;
239
&lt;span class="na"&gt;custom.date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;
240
&lt;span class="na"&gt;custom.branches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;
241
&lt;/pre&gt;&lt;/div&gt;
242
&lt;p&gt;This one enables some extensions I find useful and specifies the username using the &lt;code&gt;$LC_HG_USERNAME&lt;/code&gt; environmental variable sent by ssh in the previous step.&lt;/p&gt;
243
&lt;/li&gt;
244
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;~/.gitconfig&lt;/code&gt; file like the following:&lt;/p&gt;
245
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[user]&lt;/span&gt;
246
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
247
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
248
&lt;span class="k"&gt;[push]&lt;/span&gt;
249
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
250
&lt;span class="k"&gt;[alias]&lt;/span&gt;
251
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;lg1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all&lt;/span&gt;
252
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;lg2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all&lt;/span&gt;
253
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;!"git lg1"&lt;/span&gt;
254
&lt;/pre&gt;&lt;/div&gt;
255
&lt;p&gt;This one provide a useful &lt;code&gt;git lg&lt;/code&gt; command and specifies the username using the &lt;code&gt;$LC_GIT_USERNAME&lt;/code&gt; etc. environmental variable sent by ssh in the previous step.&lt;/p&gt;
256
&lt;/li&gt;
257
&lt;li&gt;&lt;p&gt;Install the &lt;a href="https://bitbucket.org/mforbes/mmf_setup"&gt;&lt;code&gt;mmf_setup&lt;/code&gt;&lt;/a&gt; package (I do this also in the &lt;code&gt;anaconda3&lt;/code&gt; environment):&lt;/p&gt;
258
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mmf_setup
259
anaconda3
260
pip3&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mmf_setup
261
exit-anaconda
262
&lt;/pre&gt;&lt;/div&gt;
263
&lt;p&gt;Note: this requires you to have enabled network access in step 2.&lt;/p&gt;
264
&lt;/li&gt;
265
&lt;li&gt;&lt;p&gt;(optional) Enable this by adding the following lines to your &lt;code&gt;~/.bash_aliases file&lt;/code&gt; on :&lt;/p&gt;
266
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bash_aliases&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
267
&lt;span class="s"&gt;# Add some customizations for mercurial etc.&lt;/span&gt;
268
&lt;span class="s"&gt;. mmf_setup&lt;/span&gt;
269
&lt;span class="s"&gt;git config --global user.name "\${LC_GIT_USERNAME}"&lt;/span&gt;
270
&lt;span class="s"&gt;git config --global user.email "\${LC_GIT_USEREMAIL}"&lt;/span&gt;
271
&lt;span class="s"&gt;EOF&lt;/span&gt;
272
&lt;/pre&gt;&lt;/div&gt;
273
&lt;p&gt;This will set your &lt;code&gt;$HGRCPATH&lt;/code&gt; path so that you can use some of the tools I provide in my &lt;a href="https://bitbucket.org/mforbes/mmf_setup"&gt;&lt;code&gt;mmf_setup&lt;/code&gt;&lt;/a&gt; package, for example, the &lt;code&gt;hg ccommit&lt;/code&gt; command which runs &lt;code&gt;nbstripout&lt;/code&gt; to remove output from Jupyter notebooks before committing them.&lt;/p&gt;
274
&lt;/li&gt;
275
&lt;li&gt;&lt;p&gt;(optional) I find the following settings very useful for tab completion etc., so I also add the following &lt;code&gt;~/.inputrc&lt;/code&gt; file on CoCalc: &lt;em&gt;(The default configuration has &lt;code&gt;LC_ALL=C&lt;/code&gt; so I do not need anything else, but see the comment below.)&lt;/em&gt;&lt;/p&gt;
276
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#~/.inputrc&lt;/span&gt;
277
278
&lt;span class="c1"&gt;# This file is used by bash to define the key behaviours. The current&lt;/span&gt;
279
&lt;span class="c1"&gt;# version allows the up and down arrows to search for history items&lt;/span&gt;
280
&lt;span class="c1"&gt;# with a common prefix.&lt;/span&gt;
281
&lt;span class="c1"&gt;#&lt;/span&gt;
282
&lt;span class="c1"&gt;# Note: For these to be properly intepreted, you need to make sure your locale&lt;/span&gt;
283
&lt;span class="c1"&gt;# is properly set in your environment with something like:&lt;/span&gt;
284
&lt;span class="c1"&gt;# export LC_ALL=C&lt;/span&gt;
285
286
&lt;span class="c1"&gt;#&lt;/span&gt;
287
&lt;span class="c1"&gt;# Arrow keys in keypad mode&lt;/span&gt;
288
&lt;span class="c1"&gt;#"\M-OD": backward-char&lt;/span&gt;
289
&lt;span class="c1"&gt;#"\M-OC": forward-char&lt;/span&gt;
290
&lt;span class="c1"&gt;#"\M-OA": previous-history&lt;/span&gt;
291
&lt;span class="c1"&gt;#"\M-OB": next-history&lt;/span&gt;
292
&lt;span class="c1"&gt;#&lt;/span&gt;
293
&lt;span class="c1"&gt;# Arrow keys in ANSI mode&lt;/span&gt;
294
&lt;span class="c1"&gt;#&lt;/span&gt;
295
&lt;span class="c1"&gt;#"\M-[D": backward-char&lt;/span&gt;
296
&lt;span class="c1"&gt;#"\M-[C": forward-char&lt;/span&gt;
297
&lt;span class="s2"&gt;"\M-[A"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-backward
298
&lt;span class="s2"&gt;"\M-[B"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-forward
299
&lt;span class="c1"&gt;#&lt;/span&gt;
300
&lt;span class="c1"&gt;# Arrow keys in 8 bit keypad mode&lt;/span&gt;
301
&lt;span class="c1"&gt;#&lt;/span&gt;
302
&lt;span class="c1"&gt;#"\M-\C-OD": backward-char&lt;/span&gt;
303
&lt;span class="c1"&gt;#"\M-\C-OC": forward-char&lt;/span&gt;
304
&lt;span class="c1"&gt;#"\M-\C-OA": previous-history&lt;/span&gt;
305
&lt;span class="c1"&gt;#"\M-\C-OB": next-history&lt;/span&gt;
306
&lt;span class="c1"&gt;#&lt;/span&gt;
307
&lt;span class="c1"&gt;# Arrow keys in 8 bit ANSI mode&lt;/span&gt;
308
&lt;span class="c1"&gt;#&lt;/span&gt;
309
&lt;span class="c1"&gt;#"\M-\C-[D": backward-char&lt;/span&gt;
310
&lt;span class="c1"&gt;#"\M-\C-[C": forward-char&lt;/span&gt;
311
&lt;span class="c1"&gt;#"\M-\C-[A": previous-history&lt;/span&gt;
312
&lt;span class="c1"&gt;#"\M-\C-[B": next-history&lt;/span&gt;
313
&lt;/pre&gt;&lt;/div&gt;
314
&lt;/li&gt;
315
&lt;li&gt;&lt;p&gt;(optional) Update and configure &lt;code&gt;pip&lt;/code&gt; to install packages as a user:&lt;/p&gt;
316
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--upgrade&lt;span class="w"&gt; &lt;/span&gt;pip
317
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Needed to use new pip before logging in again&lt;/span&gt;
318
319
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.config/pip/
320
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.config/pip/pip.conf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
321
&lt;span class="s"&gt;[install]&lt;/span&gt;
322
&lt;span class="s"&gt;user = true&lt;/span&gt;
323
&lt;span class="s"&gt;find-links = https://bitbucket.org/mforbes/mypi/&lt;/span&gt;
324
&lt;span class="s"&gt;EOF&lt;/span&gt;
325
&lt;/pre&gt;&lt;/div&gt;
326
&lt;p&gt;The configuration uses my personal index which allows me to point to various revisions of my software.&lt;/p&gt;
327
&lt;/li&gt;
328
&lt;/ol&gt;
329
330
&lt;/div&gt;
331
&lt;/div&gt;
332
&lt;/div&gt;
333
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
334
&lt;/div&gt;&lt;div class="inner_cell"&gt;
335
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
336
&lt;h2 id="Custom-Environments"&gt;Custom Environments&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Custom-Environments"&gt;&lt;/a&gt;&lt;/h2&gt;
337
&lt;/div&gt;
338
&lt;/div&gt;
339
&lt;/div&gt;
340
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
341
&lt;/div&gt;&lt;div class="inner_cell"&gt;
342
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
343
&lt;h3 id="TL;DR:"&gt;TL;DR:&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#TL;DR:"&gt;&lt;/a&gt;&lt;/h3&gt;
344
&lt;/div&gt;
345
&lt;/div&gt;
346
&lt;/div&gt;
347
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
348
&lt;/div&gt;&lt;div class="inner_cell"&gt;
349
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
350
&lt;p&gt;Create an appropriate &lt;code&gt;environment.yml&lt;/code&gt; file:&lt;/p&gt;
351
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# environment.yml&lt;/span&gt;
352
name:&lt;span class="w"&gt; &lt;/span&gt;_my_environment
353
channels:
354
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;defaults
355
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;conda-forge
356
dependencies:
357
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
358
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;matplotlib
359
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;scipy
360
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;sympy
361
362
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;ipykernel
363
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;ipython
364
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#- notebook&lt;/span&gt;
365
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#- numexpr&lt;/span&gt;
366
367
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;pytest
368
369
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Profiling&lt;/span&gt;
370
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;line_profiler
371
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#- psutil&lt;/span&gt;
372
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;memory_profiler
373
374
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;pip:
375
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;mmf_setup
376
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;hg+ssh://[email protected]/mforbes/[email protected]
377
&lt;/pre&gt;&lt;/div&gt;
378
379
&lt;/div&gt;
380
&lt;/div&gt;
381
&lt;/div&gt;
382
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
383
&lt;/div&gt;&lt;div class="inner_cell"&gt;
384
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
385
&lt;p&gt;We would like to move towards a workflow with custom conda environments. The idea is described here:&lt;/p&gt;
386
&lt;ul&gt;
387
&lt;li&gt;&lt;a href="https://github.com/sagemathinc/cocalc/wiki/Programming#anaconda-sage"&gt;https://github.com/sagemathinc/cocalc/wiki/Programming#anaconda-sage&lt;/a&gt;&lt;/li&gt;
388
&lt;/ul&gt;
389
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;smctov
390
anaconda2019
391
conda&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;work3&lt;span class="w"&gt; &lt;/span&gt;--clone&lt;span class="w"&gt; &lt;/span&gt;base&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Clone the base environment&lt;/span&gt;
392
&lt;/pre&gt;&lt;/div&gt;
393
&lt;p&gt;Notes:&lt;/p&gt;
394
&lt;ul&gt;
395
&lt;li&gt;Apparently this will download a whole bunch of stuff even though we are asking for a clone. This is a known issue: &lt;a href="https://github.com/conda/constructor/issues/145"&gt;conda/constructor#145&lt;/a&gt;, &lt;a href="https://github.com/conda/conda/issues/7398"&gt;conda#7398&lt;/a&gt;.&lt;/li&gt;
396
&lt;/ul&gt;
397
&lt;p&gt;Once you have a custom environment, you can locate it and make a &lt;a href="https://doc.cocalc.com/howto/custom-jupyter-kernel.html"&gt;custom Jupyter kernel&lt;/a&gt; for it. First locate the environment:&lt;/p&gt;
398
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;env&lt;span class="w"&gt; &lt;/span&gt;list
399
&lt;span class="c1"&gt;# conda environments:&lt;/span&gt;
400
&lt;span class="c1"&gt;#&lt;/span&gt;
401
base&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/ext/anaconda5-py3
402
xeus&lt;span class="w"&gt; &lt;/span&gt;/ext/anaconda5-py3/envs/xeus
403
_gpe&lt;span class="w"&gt; &lt;/span&gt;/home/user/.conda/envs/_gpe
404
&lt;/pre&gt;&lt;/div&gt;
405
&lt;p&gt;Now copy another specification, then edit the &lt;code&gt;kernel.json&lt;/code&gt; file. Here is what I ended up with:&lt;/p&gt;
406
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/
407
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/
408
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/ext/anaconda2020.02/share/jupyter/kernels/python3&lt;span class="w"&gt; &lt;/span&gt;work-py
409
vi&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/work-py/kernel.json
410
&lt;/pre&gt;&lt;/div&gt;
411
&lt;p&gt;The name of the directory here &lt;code&gt;work-py&lt;/code&gt; matches the name of the kernel on my machine where I use the &lt;code&gt;ipykernel&lt;/code&gt; package. This allows me to use the same notebooks going back and forth without changing the kernel.&lt;/p&gt;
412
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ker&lt;/span&gt;&lt;span class="kc"&gt;nel&lt;/span&gt;&lt;span class="err"&gt;.jso&lt;/span&gt;&lt;span class="kc"&gt;n&lt;/span&gt;
413
&lt;span class="p"&gt;{&lt;/span&gt;
414
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;"argv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
415
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/user/.conda/envs/work/bin/python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
416
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
417
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ipykernel_launcher"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
418
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
419
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{connection_file}"&lt;/span&gt;
420
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
421
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;"display_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
422
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;
423
&lt;span class="p"&gt;}&lt;/span&gt;
424
&lt;/pre&gt;&lt;/div&gt;
425
426
&lt;/div&gt;
427
&lt;/div&gt;
428
&lt;/div&gt;
429
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
430
&lt;/div&gt;&lt;div class="inner_cell"&gt;
431
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
432
&lt;h3 id="MayaVi"&gt;MayaVi&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#MayaVi"&gt;&lt;/a&gt;&lt;/h3&gt;
433
&lt;/div&gt;
434
&lt;/div&gt;
435
&lt;/div&gt;
436
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
437
&lt;/div&gt;&lt;div class="inner_cell"&gt;
438
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
439
&lt;p&gt;&lt;a href="https://docs.enthought.com/mayavi/mayavi/"&gt;MayaVi&lt;/a&gt; is a nice rendering engine for analyzing 3D data-structures, but poses some problems for use on CoCalc. Here we describe these and how to get it working.&lt;/p&gt;
440
&lt;ol&gt;
441
&lt;li&gt;&lt;p&gt;Create an appropriate conda environment and associated kernel as described above. For example:&lt;/p&gt;
442
&lt;ol&gt;
443
&lt;li&gt;&lt;p&gt;Create an &lt;code&gt;environment.yml&lt;/code&gt; file:&lt;/p&gt;
444
&lt;pre&gt;&lt;code&gt;yml
445
# environment.mayavi3.yml
446
name: mayavi3
447
channels:
448
- defaults
449
- conda-forge
450
dependencies:
451
- python=3
452
- ipykernel
453
- mayavi
454
- xvfbwrapper
455
456
# jupyter is only needed in the first environment to run
457
# jupyter nbextension install --py mayavi --user
458
# Once this is run from an environment with *both* jupyter
459
# and mayavi, it is not needed in future environments.
460
- jupyter
461
&lt;/code&gt;&lt;/pre&gt;
462
&lt;p&gt;&lt;em&gt;We need jupyter here so we can install the appropriate CSS etc. to allow or rendering.&lt;/em&gt;&lt;/p&gt;
463
&lt;/li&gt;
464
&lt;li&gt;&lt;p&gt;Activate anaconda and create the mayavi3 environment:&lt;/p&gt;
465
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;anaconda2019
466
conda&lt;span class="w"&gt; &lt;/span&gt;env&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;environment.mayavi3.yml
467
&lt;/pre&gt;&lt;/div&gt;
468
&lt;/li&gt;
469
&lt;li&gt;&lt;p&gt;Create the appropriate kernel:&lt;/p&gt;
470
&lt;p&gt;Find the location of current kernels:&lt;/p&gt;
471
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# This path is a kludge. Check it! The awk command strips spaces&lt;/span&gt;
472
&lt;span class="c1"&gt;# https://unix.stackexchange.com/a/205854&lt;/span&gt;
473
&lt;span class="nv"&gt;base_kernel_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;--paths&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;ext&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;share&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{$1=$1;print}'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
474
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"'&lt;/span&gt;&lt;span class="nv"&gt;$base_kernel_dir&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
475
&lt;/pre&gt;&lt;/div&gt;
476
&lt;p&gt;At the time of running, this is: &lt;code&gt;/ext/anaconda-2019.03/share/jupyter&lt;/code&gt;&lt;/p&gt;
477
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/
478
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$base_kernel_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/kernels/python3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
479
&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/conda-env-mayavi3-py
480
vi&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/jupyter/kernels/conda-env-mayavi3-py/kernel.json
481
&lt;/pre&gt;&lt;/div&gt;
482
&lt;/li&gt;
483
&lt;/ol&gt;
484
&lt;/li&gt;
485
&lt;li&gt;&lt;p&gt;Activate the environment and install the javascript required to render the output:&lt;/p&gt;
486
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;anaconda2019
487
conda&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;mayavi3
488
jupyter&lt;span class="w"&gt; &lt;/span&gt;nbextension&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--py&lt;span class="w"&gt; &lt;/span&gt;mayavi&lt;span class="w"&gt; &lt;/span&gt;--user
489
jupyter&lt;span class="w"&gt; &lt;/span&gt;nbextension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mayavi&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;--py
490
&lt;/pre&gt;&lt;/div&gt;
491
&lt;p&gt;This places the javascript etc. in &lt;code&gt;./.local/share/jupyter/nbextensions/mayavi&lt;/code&gt; and adds an entry in &lt;code&gt;~/.jupyter/nbconfig/notebook.json&lt;/code&gt;:&lt;/p&gt;
492
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
493
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;"load_extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
494
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;"mayavi/x3d/x3dom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
495
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
496
&lt;span class="p"&gt;}&lt;/span&gt;
497
&lt;/pre&gt;&lt;/div&gt;
498
&lt;/li&gt;
499
&lt;li&gt;&lt;p&gt;Start a new notebook with your kernel, run it in the classic notebook server ("switch to classic notebook..." under "File").&lt;/p&gt;
500
&lt;/li&gt;
501
&lt;li&gt;&lt;p&gt;Start a virtual frame-buffer and then use MayaVi with something like the following in your notebook:&lt;/p&gt;
502
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;xvfbwrapper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Xvfb&lt;/span&gt;
503
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Xvfb&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;xvfb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
504
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;mayavi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mlab&lt;/span&gt;
505
&lt;span class="n"&gt;mlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init_notebook&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
506
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_plot3d&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
507
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
508
&lt;/pre&gt;&lt;/div&gt;
509
&lt;p&gt;Alternatively, you can skip the context and do something like:&lt;/p&gt;
510
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;xvfbwrapper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Xvfb&lt;/span&gt;
511
&lt;span class="n"&gt;vdisplay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Xvfb&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
512
&lt;span class="n"&gt;vdisplay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
513
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;mayavi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mlab&lt;/span&gt;
514
&lt;span class="n"&gt;mlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init_notebook&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
515
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_plot3d&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
516
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
517
&lt;span class="n"&gt;vdisplay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Calling this becomes a bit more onerous, but might not be critical&lt;/span&gt;
518
&lt;/pre&gt;&lt;/div&gt;
519
&lt;p&gt;See &lt;a href="https://github.com/cgoldberg/xvfbwrapper"&gt;xvfbwrapper&lt;/a&gt; for more details.&lt;/p&gt;
520
&lt;/li&gt;
521
&lt;/ol&gt;
522
523
&lt;/div&gt;
524
&lt;/div&gt;
525
&lt;/div&gt;
526
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
527
&lt;/div&gt;&lt;div class="inner_cell"&gt;
528
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
529
&lt;h2 id="System-Software"&gt;System Software&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#System-Software"&gt;&lt;/a&gt;&lt;/h2&gt;
530
&lt;/div&gt;
531
&lt;/div&gt;
532
&lt;/div&gt;
533
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
534
&lt;/div&gt;&lt;div class="inner_cell"&gt;
535
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
536
&lt;p&gt;One can definitely build system software from source, linking it into &lt;code&gt;~/.local/bin/&lt;/code&gt; etc. I am not sure if there is a way of using &lt;code&gt;apt-get&lt;/code&gt; or other package managers yet.&lt;/p&gt;
537
538
&lt;/div&gt;
539
&lt;/div&gt;
540
&lt;/div&gt;
541
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
542
&lt;/div&gt;&lt;div class="inner_cell"&gt;
543
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
544
&lt;h2 id="Synchronization"&gt;Synchronization&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Synchronization"&gt;&lt;/a&gt;&lt;/h2&gt;
545
&lt;/div&gt;
546
&lt;/div&gt;
547
&lt;/div&gt;
548
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
549
&lt;/div&gt;&lt;div class="inner_cell"&gt;
550
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
551
&lt;p&gt;The automatic synchronization mechansim of CoCalc has some issues. The issue (&lt;a href="https://github.com/sagemathinc/smc/issues/96"&gt;#96&lt;/a&gt;) is that when you VCS updates the files, it can change the modification date in a way tha triggers the autosave system to revert to a previous version. The symptom is that you initially load the notebook that you want, but within seconds it reverts to an old (or even blank version).&lt;/p&gt;
552
&lt;p&gt;Thus, it is somewhat dangerous to perform a VCS update on CoCalc: you risk losing local work. Note: none of the work is lost - you can navigate to the project page and look for the "Backups" button on the file browser. This will take you to read-only copies of your work which you can use to restore anything lost this way.&lt;/p&gt;
553
&lt;p&gt;Presently, the only safe solution to update files from outside of the UI is to update them in a new directory.&lt;/p&gt;
554
555
&lt;/div&gt;
556
&lt;/div&gt;
557
&lt;/div&gt;
558
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
559
&lt;/div&gt;&lt;div class="inner_cell"&gt;
560
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
561
&lt;h2 id="MathJaX"&gt;MathJaX&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#MathJaX"&gt;&lt;/a&gt;&lt;/h2&gt;
562
&lt;/div&gt;
563
&lt;/div&gt;
564
&lt;/div&gt;
565
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
566
&lt;/div&gt;&lt;div class="inner_cell"&gt;
567
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
568
&lt;p&gt;&lt;a href="https://www.mathjax.org/"&gt;MathJaX&lt;/a&gt; is rather slow, so in 2018 CoCalc has &lt;a href="http://blog.sagemath.com/latex/2018/03/23/cocalc-katex.html"&gt;enabled&lt;/a&gt; &lt;a href="https://khan.github.io/KaTeX/"&gt;KaTeX&lt;/a&gt;. Unfortunately, KaTeX is not as feature rich as MathJaX. If you need full MathJaX functionality, then you can revert to MathJaX in your account settings.&lt;/p&gt;
569
570
&lt;/div&gt;
571
&lt;/div&gt;
572
&lt;/div&gt;
573
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
574
&lt;/div&gt;&lt;div class="inner_cell"&gt;
575
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
576
&lt;h2 id="RClone-for-Google-Drive-etc."&gt;RClone for Google Drive etc.&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#RClone-for-Google-Drive-etc."&gt;&lt;/a&gt;&lt;/h2&gt;
577
&lt;/div&gt;
578
&lt;/div&gt;
579
&lt;/div&gt;
580
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
581
&lt;/div&gt;&lt;div class="inner_cell"&gt;
582
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
583
&lt;p&gt;The program &lt;a href="http://rclone.org"&gt;rclone&lt;/a&gt; provides a command-line interface for several applications like Dropbox and Google Drive. Here are some notes about using it:&lt;/p&gt;
584
&lt;ol&gt;
585
&lt;li&gt;&lt;p&gt;Make sure internet access is enabled for you project.&lt;/p&gt;
586
&lt;/li&gt;
587
&lt;li&gt;&lt;p&gt;&lt;strike&gt;Install it by downloading the binary and installing it in &lt;code&gt;~/.local/bin/rclone&lt;/code&gt;.&lt;/strike&gt; The &lt;code&gt;rclone&lt;/code&gt; software is already installed on CoCalc.&lt;/p&gt;
588
&lt;/li&gt;
589
&lt;li&gt;&lt;p&gt;Add a remote by running &lt;code&gt;rclone config&lt;/code&gt;. Some notes:&lt;/p&gt;
590
&lt;ul&gt;
591
&lt;li&gt;For the "Scope" I chose "Full access all files". More secure would be "Access to files created by rclone only" but this will not work if you add files from another device.&lt;/li&gt;
592
&lt;li&gt;If you want to link a specific folder, you can copy the "ID of the root folder" from the last part of the URL when you open the folder in Google Drive. It looks something like "1RAtwfvaJUk4vULw1z1t1qKWJCsJIRqCZ".&lt;/li&gt;
593
&lt;li&gt;When asked for "Auto config" choose no - this is a "headless" configuration.&lt;/li&gt;
594
&lt;/ul&gt;
595
&lt;p&gt;I choose the name &lt;code&gt;gd&lt;/code&gt; for the Google Drive remote. Following the provided link and link your account.&lt;/p&gt;
596
&lt;/li&gt;
597
&lt;li&gt;&lt;p&gt;You can now explore with:&lt;/p&gt;
598
&lt;pre&gt;&lt;code&gt;rclone lsd gd: # Show remote directories
599
rclone copy gd:PaperQuantumTurbulence . # Copy a folder
600
rclone check gd:PaperQuantumTurbulence PaperQuantumTurbulence
601
rclone sync gd:PaperQuantumTurbulence PaperQuantumTurbulence # Like rsync -d
602
&lt;/code&gt;&lt;/pre&gt;
603
&lt;/li&gt;
604
&lt;/ol&gt;
605
606
&lt;/div&gt;
607
&lt;/div&gt;
608
&lt;/div&gt;
609
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
610
&lt;/div&gt;&lt;div class="inner_cell"&gt;
611
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
612
&lt;h2 id="Notebook-Extensions"&gt;Notebook Extensions&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Notebook-Extensions"&gt;&lt;/a&gt;&lt;/h2&gt;
613
&lt;/div&gt;
614
&lt;/div&gt;
615
&lt;/div&gt;
616
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
617
&lt;/div&gt;&lt;div class="inner_cell"&gt;
618
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
619
&lt;p&gt;One can use Jupyter notebook extensions (&lt;a href="https://github.com/ipython-contrib/jupyter_contrib_nbextensions"&gt;nbextensions&lt;/a&gt;) with only the Classic Notebook interface. As per &lt;a href="https://github.com/sagemathinc/smc/issues/985"&gt;issue 985&lt;/a&gt;, extensions will not be supported with the Modern Notebook interface, but their goal is to independently implement useful extensions, so file an issue if there is something you want. In this section, we discuss how to enable extensions with the Classic Interface.&lt;/p&gt;
620
&lt;ol&gt;
621
&lt;li&gt;Open your notebook.&lt;/li&gt;
622
&lt;li&gt;At the bottom of the &lt;code&gt;File&lt;/code&gt; menu choose &lt;code&gt;File/Switch to classical notebook...&lt;/code&gt;. (As per &lt;a href="https://github.com/sagemathinc/cocalc/issues/1537"&gt;issue 1537&lt;/a&gt;, this will not work with Firefox.)&lt;/li&gt;
623
&lt;li&gt;At the bottom of the &lt;code&gt;Edit&lt;/code&gt; menu choose &lt;code&gt;Edit/nbextensions config&lt;/code&gt;. This will allow you to enable various extensions.&lt;/li&gt;
624
&lt;/ol&gt;
625
&lt;h3 id="(Old-Procedure:-Not-Needed-Anymore)"&gt;(Old Procedure: Not Needed Anymore)&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#(Old-Procedure:-Not-Needed-Anymore)"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
626
&lt;li&gt;&lt;p&gt;Enable internet access.&lt;/p&gt;
627
&lt;/li&gt;
628
&lt;li&gt;&lt;p&gt;Install the code:&lt;/p&gt;
629
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tarball/master
630
&lt;/pre&gt;&lt;/div&gt;
631
&lt;p&gt;Note: this will also install a copy of &lt;code&gt;jupyter&lt;/code&gt; which is not ideal and is not the one that is run by default, but it will allow you to configure things.&lt;/p&gt;
632
&lt;/li&gt;
633
&lt;li&gt;&lt;p&gt;Symbolically link this to your user directory:&lt;/p&gt;
634
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;~/.local/lib/python2.7/site-packages/jupyter_contrib_nbextensions/nbextensions&lt;span class="w"&gt; &lt;/span&gt;.jupyter/
635
&lt;/pre&gt;&lt;/div&gt;
636
&lt;/li&gt;
637
&lt;li&gt;&lt;p&gt;Install the extensions:&lt;/p&gt;
638
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;contrib&lt;span class="w"&gt; &lt;/span&gt;nbextension&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--user
639
&lt;/pre&gt;&lt;/div&gt;
640
&lt;p&gt;This step adds the configuration files.&lt;/p&gt;
641
&lt;/li&gt;
642
&lt;li&gt;&lt;p&gt;Restart the server.&lt;/p&gt;
643
&lt;/li&gt;
644
&lt;li&gt;&lt;p&gt;Reload your notebooks.&lt;/p&gt;
645
&lt;/li&gt;
646
&lt;/ol&gt;
647
&lt;p&gt;You should now see a new menu item: &lt;code&gt;Edit/nbextensions config&lt;/code&gt;. From this you can enable various extensions. You will need to refresh/reload each notebook when you make changes.&lt;/p&gt;
648
&lt;p&gt;&lt;em&gt;Note: This is not a proper installation, so some features may be broken. The Table of Contents (2) feature works, however, which is one of my main uses.)&lt;/em&gt;&lt;/p&gt;
649
650
&lt;/div&gt;
651
&lt;/div&gt;
652
&lt;/div&gt;
653
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
654
&lt;/div&gt;&lt;div class="inner_cell"&gt;
655
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
656
&lt;h2 id="Raw-File-Access"&gt;Raw File Access&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Raw-File-Access"&gt;&lt;/a&gt;&lt;/h2&gt;
657
&lt;/div&gt;
658
&lt;/div&gt;
659
&lt;/div&gt;
660
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
661
&lt;/div&gt;&lt;div class="inner_cell"&gt;
662
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
663
&lt;p&gt;If you want to directly access files such as HTML files without the CoCalc interface, you can. This is &lt;a href="https://github.com/sagemathinc/cocalc/wiki/share#file-sharing-tips"&gt;described here&lt;/a&gt;.&lt;/p&gt;
664
665
&lt;/div&gt;
666
&lt;/div&gt;
667
&lt;/div&gt;
668
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
669
&lt;/div&gt;&lt;div class="inner_cell"&gt;
670
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
671
&lt;h2 id="Configuration-Files"&gt;Configuration Files&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Configuration-Files"&gt;&lt;/a&gt;&lt;/h2&gt;
672
&lt;/div&gt;
673
&lt;/div&gt;
674
&lt;/div&gt;
675
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
676
&lt;/div&gt;&lt;div class="inner_cell"&gt;
677
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
678
&lt;p&gt;Here are the ultimate contents of the configuration files I have on my computer and on CoCalc. These may get out of date. For up-to-date versions, please see the &lt;a href="https://bitbucket.org/mforbes/configurations/src/trunk/complete_systems/cocalc/"&gt;configurations/complete_systems/cocalc&lt;/a&gt; folder on my confgurations project.&lt;/p&gt;
679
680
&lt;/div&gt;
681
&lt;/div&gt;
682
&lt;/div&gt;
683
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
684
&lt;/div&gt;&lt;div class="inner_cell"&gt;
685
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
686
&lt;h3 id="Your-Computer"&gt;Your Computer&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Your-Computer"&gt;&lt;/a&gt;&lt;/h3&gt;
687
&lt;/div&gt;
688
&lt;/div&gt;
689
&lt;/div&gt;
690
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
691
&lt;/div&gt;&lt;div class="inner_cell"&gt;
692
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
693
&lt;h4 id="~/.bashrc"&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.bashrc"&gt;&lt;/a&gt;&lt;/h4&gt;
694
&lt;/div&gt;
695
&lt;/div&gt;
696
&lt;/div&gt;
697
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
698
&lt;/div&gt;&lt;div class="inner_cell"&gt;
699
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
700
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ~/.bashrc&lt;/span&gt;
701
702
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HG_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Michael McNeil Forbes &amp;lt;[email protected]&amp;gt;"&lt;/span&gt;
703
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GIT_USEREMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"[email protected]"&lt;/span&gt;
704
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GIT_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Michael McNeil Forbes"&lt;/span&gt;
705
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_HG_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HG_USERNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
706
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_GIT_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_USERNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
707
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LC_GIT_USEREMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_USEREMAIL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
708
&lt;/pre&gt;&lt;/div&gt;
709
710
&lt;/div&gt;
711
&lt;/div&gt;
712
&lt;/div&gt;
713
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
714
&lt;/div&gt;&lt;div class="inner_cell"&gt;
715
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
716
&lt;h4 id="~/.ssh/config"&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.ssh/config"&gt;&lt;/a&gt;&lt;/h4&gt;
717
&lt;/div&gt;
718
&lt;/div&gt;
719
&lt;/div&gt;
720
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
721
&lt;/div&gt;&lt;div class="inner_cell"&gt;
722
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
723
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# ~/.ssh/config:&lt;/span&gt;
724
Host&lt;span class="w"&gt; &lt;/span&gt;smc*
725
&lt;span class="w"&gt; &lt;/span&gt;HostName&lt;span class="w"&gt; &lt;/span&gt;ssh.cocalc.com
726
&lt;span class="w"&gt; &lt;/span&gt;ForwardAgent&lt;span class="w"&gt; &lt;/span&gt;yes
727
&lt;span class="w"&gt; &lt;/span&gt;SendEnv&lt;span class="w"&gt; &lt;/span&gt;LC_HG_USERNAME
728
&lt;span class="w"&gt; &lt;/span&gt;SendEnv&lt;span class="w"&gt; &lt;/span&gt;LC_GIT_USERNAME
729
&lt;span class="w"&gt; &lt;/span&gt;SendEnv&lt;span class="w"&gt; &lt;/span&gt;LC_GIT_USEREMAIL
730
731
Host&lt;span class="w"&gt; &lt;/span&gt;smcbec...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Some convenient name&lt;/span&gt;
732
&lt;span class="w"&gt; &lt;/span&gt;User&lt;span class="w"&gt; &lt;/span&gt;01a3...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Use the code listed on CoCalc&lt;/span&gt;
733
&lt;/pre&gt;&lt;/div&gt;
734
735
&lt;/div&gt;
736
&lt;/div&gt;
737
&lt;/div&gt;
738
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
739
&lt;/div&gt;&lt;div class="inner_cell"&gt;
740
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
741
&lt;h3 id="CoCalc-Project"&gt;CoCalc Project&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#CoCalc-Project"&gt;&lt;/a&gt;&lt;/h3&gt;
742
&lt;/div&gt;
743
&lt;/div&gt;
744
&lt;/div&gt;
745
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
746
&lt;/div&gt;&lt;div class="inner_cell"&gt;
747
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
748
&lt;h4 id="~/.bash_alias"&gt;&lt;code&gt;~/.bash_alias&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.bash_alias"&gt;&lt;/a&gt;&lt;/h4&gt;
749
&lt;/div&gt;
750
&lt;/div&gt;
751
&lt;/div&gt;
752
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
753
&lt;/div&gt;&lt;div class="inner_cell"&gt;
754
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
755
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Bash Alias File; -*-Shell-script-*-&lt;/span&gt;
756
&lt;span class="c1"&gt;# dest = ~/.bash_alias # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
757
&lt;span class="c1"&gt;#&lt;/span&gt;
758
&lt;span class="c1"&gt;# On CoCalc, this file is automatically sourced, so it is where you&lt;/span&gt;
759
&lt;span class="c1"&gt;# should keep your customizations.&lt;/span&gt;
760
&lt;span class="c1"&gt;#&lt;/span&gt;
761
&lt;span class="c1"&gt;# LC_* variables:&lt;/span&gt;
762
&lt;span class="c1"&gt;#&lt;/span&gt;
763
&lt;span class="c1"&gt;# Since each user logs in with the same user-id (specific to the&lt;/span&gt;
764
&lt;span class="c1"&gt;# project), I use the following mechanism to keep track of who is&lt;/span&gt;
765
&lt;span class="c1"&gt;# logged in for the purposes of using version control like hg and git.&lt;/span&gt;
766
&lt;span class="c1"&gt;#&lt;/span&gt;
767
&lt;span class="c1"&gt;# You should define the following variables on your home machine and then tell&lt;/span&gt;
768
&lt;span class="c1"&gt;# ssh to forward these:&lt;/span&gt;
769
&lt;span class="c1"&gt;#&lt;/span&gt;
770
&lt;span class="c1"&gt;# ~/.bashrc:&lt;/span&gt;
771
&lt;span class="c1"&gt;#&lt;/span&gt;
772
&lt;span class="c1"&gt;# export HG_USERNAME="Michael McNeil Forbes &amp;lt;[email protected]&amp;gt;"&lt;/span&gt;
773
&lt;span class="c1"&gt;# export GIT_USEREMAIL="[email protected]"&lt;/span&gt;
774
&lt;span class="c1"&gt;# export GIT_USERNAME="Michael McNeil Forbes"&lt;/span&gt;
775
&lt;span class="c1"&gt;# export LC_HG_USERNAME="${HG_USERNAME}"&lt;/span&gt;
776
&lt;span class="c1"&gt;# export LC_GIT_USERNAME="${GIT_USERNAME}"&lt;/span&gt;
777
&lt;span class="c1"&gt;# export LC_GIT_USEREMAIL="${GIT_USEREMAIL}"&lt;/span&gt;
778
&lt;span class="c1"&gt;#&lt;/span&gt;
779
&lt;span class="c1"&gt;# ~/.ssh/config:&lt;/span&gt;
780
&lt;span class="c1"&gt;#&lt;/span&gt;
781
&lt;span class="c1"&gt;# Host smc*&lt;/span&gt;
782
&lt;span class="c1"&gt;# HostName ssh.cocalc.com&lt;/span&gt;
783
&lt;span class="c1"&gt;# ForwardAgent yes&lt;/span&gt;
784
&lt;span class="c1"&gt;# SendEnv LC_HG_USERNAME&lt;/span&gt;
785
&lt;span class="c1"&gt;# SendEnv LC_GIT_USERNAME&lt;/span&gt;
786
&lt;span class="c1"&gt;# SendEnv LC_GIT_USEREMAIL&lt;/span&gt;
787
&lt;span class="c1"&gt;# Host smc... # Some convenient name&lt;/span&gt;
788
&lt;span class="c1"&gt;# User 01a3... # Use the code listed on CoCalc&lt;/span&gt;
789
&lt;span class="c1"&gt;#&lt;/span&gt;
790
&lt;span class="c1"&gt;# Then you can `ssh smc...` and your username will be forwarded.&lt;/span&gt;
791
792
&lt;span class="c1"&gt;# This content inserted by mmf_setup&lt;/span&gt;
793
&lt;span class="c1"&gt;# Add my mercurial commands like hg ccom for removing output from .ipynb files&lt;/span&gt;
794
.&lt;span class="w"&gt; &lt;/span&gt;mmf_setup
795
796
797
&lt;span class="c1"&gt;# Specified here since .gitconfig will not expand the variables&lt;/span&gt;
798
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\${LC_GIT_USERNAME}"&lt;/span&gt;
799
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.email&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\${LC_GIT_USEREMAIL}"&lt;/span&gt;
800
801
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;INPUTRC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.inputrc
802
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SCREENDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.screen
803
804
&lt;span class="c1"&gt;# I structure my projects with a top level repositories directory&lt;/span&gt;
805
&lt;span class="c1"&gt;# where I include custom repos. The following is installed by:&lt;/span&gt;
806
&lt;span class="c1"&gt;#&lt;/span&gt;
807
&lt;span class="c1"&gt;# mkdir ~/repositories&lt;/span&gt;
808
&lt;span class="c1"&gt;# hg clone ssh://[email protected]/mforbes/mmfhg ~/repositories/mmfhg&lt;/span&gt;
809
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;MMFHG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/repositories/mmfhg
810
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HGRCPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HGRCPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MMFHG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/hgrc
811
812
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vi
813
814
&lt;span class="c1"&gt;# Finding stuff&lt;/span&gt;
815
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;finda&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
816
&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
817
&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".hg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".ipynb_checkpoints"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.sage-*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-prune&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
818
&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-print0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;-0&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*:&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
819
&lt;span class="o"&gt;}&lt;/span&gt;
820
821
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
822
&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
823
&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".hg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".ipynb_checkpoints"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.sage-*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-prune&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
824
&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-print0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;-0&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*:&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
825
&lt;span class="o"&gt;}&lt;/span&gt;
826
827
&lt;span class="c1"&gt;# I used to use aliases, but they cannot easily be overrriden by&lt;/span&gt;
828
&lt;span class="c1"&gt;# personalzed customizations.&lt;/span&gt;
829
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findpy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findf&lt;span class="w"&gt; &lt;/span&gt;py&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
830
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findipy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findf&lt;span class="w"&gt; &lt;/span&gt;ipynb&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
831
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findjs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findf&lt;span class="w"&gt; &lt;/span&gt;js&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
832
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findcss&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;findf&lt;span class="w"&gt; &lt;/span&gt;css&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
833
&lt;/pre&gt;&lt;/div&gt;
834
835
&lt;/div&gt;
836
&lt;/div&gt;
837
&lt;/div&gt;
838
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
839
&lt;/div&gt;&lt;div class="inner_cell"&gt;
840
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
841
&lt;h4 id="~/.inputrc"&gt;&lt;code&gt;~/.inputrc&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.inputrc"&gt;&lt;/a&gt;&lt;/h4&gt;
842
&lt;/div&gt;
843
&lt;/div&gt;
844
&lt;/div&gt;
845
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
846
&lt;/div&gt;&lt;div class="inner_cell"&gt;
847
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
848
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Bash Input Init File; -*-Shell-script-*-&lt;/span&gt;
849
&lt;span class="c1"&gt;# dest = ~/.inputrc # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
850
851
&lt;span class="c1"&gt;# This file is used by bash to define the key behaviours. The current&lt;/span&gt;
852
&lt;span class="c1"&gt;# version allows the up and down arrows to search for history items&lt;/span&gt;
853
&lt;span class="c1"&gt;# with a common prefix.&lt;/span&gt;
854
&lt;span class="c1"&gt;#&lt;/span&gt;
855
&lt;span class="c1"&gt;# Note: For these to be properly intepreted, you need to make sure your locale&lt;/span&gt;
856
&lt;span class="c1"&gt;# is properly set in your environment with something like:&lt;/span&gt;
857
&lt;span class="c1"&gt;# export LC_ALL=C&lt;/span&gt;
858
859
&lt;span class="s2"&gt;"\M-[A"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-backward
860
&lt;span class="s2"&gt;"\M-[B"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-forward
861
&lt;span class="s2"&gt;"\e[A"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-backward
862
&lt;span class="s2"&gt;"\e[B"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;history-search-forward
863
&lt;/pre&gt;&lt;/div&gt;
864
865
&lt;/div&gt;
866
&lt;/div&gt;
867
&lt;/div&gt;
868
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
869
&lt;/div&gt;&lt;div class="inner_cell"&gt;
870
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
871
&lt;h4 id="~/.hgrc"&gt;&lt;code&gt;~/.hgrc&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.hgrc"&gt;&lt;/a&gt;&lt;/h4&gt;
872
&lt;/div&gt;
873
&lt;/div&gt;
874
&lt;/div&gt;
875
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
876
&lt;/div&gt;&lt;div class="inner_cell"&gt;
877
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
878
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Mercurial (hg) Init File; -*-Shell-script-*-&lt;/span&gt;
879
&lt;span class="c1"&gt;# dest = ~/.hgrc # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
880
881
&lt;span class="o"&gt;[&lt;/span&gt;ui&lt;span class="o"&gt;]&lt;/span&gt;
882
&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$LC_HG_USERNAME&lt;/span&gt;
883
&lt;span class="nv"&gt;merge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;emacs
884
&lt;span class="nv"&gt;paginate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;never
885
886
&lt;span class="o"&gt;[&lt;/span&gt;extensions&lt;span class="o"&gt;]&lt;/span&gt;
887
&lt;span class="c1"&gt;# Builtin extensions:&lt;/span&gt;
888
&lt;span class="nv"&gt;rebase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
889
&lt;span class="nv"&gt;graphlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
890
&lt;span class="nv"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
891
&lt;span class="nv"&gt;record&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
892
&lt;span class="nv"&gt;histedit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
893
&lt;span class="nv"&gt;strip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
894
&lt;span class="c1"&gt;#extdiff =&lt;/span&gt;
895
&lt;span class="c1"&gt;#mq =&lt;/span&gt;
896
&lt;span class="c1"&gt;#purge =&lt;/span&gt;
897
&lt;span class="c1"&gt;#transplant =&lt;/span&gt;
898
&lt;span class="c1"&gt;#evolve =&lt;/span&gt;
899
&lt;span class="c1"&gt;#amend =&lt;/span&gt;
900
901
&lt;span class="o"&gt;[&lt;/span&gt;color&lt;span class="o"&gt;]&lt;/span&gt;
902
custom.rev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;red
903
custom.author&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;blue
904
custom.date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;green
905
custom.branches&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;red
906
907
&lt;span class="o"&gt;[&lt;/span&gt;merge-tools&lt;span class="o"&gt;]&lt;/span&gt;
908
emacs.args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;--eval&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(ediff-merge-with-ancestor \""&lt;/span&gt;&lt;span class="nv"&gt;$local&lt;/span&gt;&lt;span class="s2"&gt;"\" \""&lt;/span&gt;&lt;span class="nv"&gt;$other&lt;/span&gt;&lt;span class="s2"&gt;"\" \""&lt;/span&gt;&lt;span class="nv"&gt;$base&lt;/span&gt;&lt;span class="s2"&gt;"\" nil \""&lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="s2"&gt;"\")"&lt;/span&gt;
909
&lt;/pre&gt;&lt;/div&gt;
910
911
&lt;/div&gt;
912
&lt;/div&gt;
913
&lt;/div&gt;
914
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
915
&lt;/div&gt;&lt;div class="inner_cell"&gt;
916
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
917
&lt;h4 id="~/.hgignore"&gt;&lt;code&gt;~/.hgignore&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.hgignore"&gt;&lt;/a&gt;&lt;/h4&gt;
918
&lt;/div&gt;
919
&lt;/div&gt;
920
&lt;/div&gt;
921
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
922
&lt;/div&gt;&lt;div class="inner_cell"&gt;
923
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
924
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Mercurial (hg) Init File; -*-Shell-script-*-&lt;/span&gt;
925
&lt;span class="c1"&gt;# dest = ~/.hgignore # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
926
927
syntax:&lt;span class="w"&gt; &lt;/span&gt;glob
928
929
&lt;span class="se"&gt;\.&lt;/span&gt;ipynb_checkpoints
930
*&lt;span class="se"&gt;\.&lt;/span&gt;sage-jupyter2
931
&lt;/pre&gt;&lt;/div&gt;
932
933
&lt;/div&gt;
934
&lt;/div&gt;
935
&lt;/div&gt;
936
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
937
&lt;/div&gt;&lt;div class="inner_cell"&gt;
938
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
939
&lt;h4 id="~/.gitconfig"&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.gitconfig"&gt;&lt;/a&gt;&lt;/h4&gt;
940
&lt;/div&gt;
941
&lt;/div&gt;
942
&lt;/div&gt;
943
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
944
&lt;/div&gt;&lt;div class="inner_cell"&gt;
945
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
946
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Git Config File; -*-Shell-script-*-&lt;/span&gt;
947
&lt;span class="c1"&gt;# dest = ~/.gitconfig # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
948
949
&lt;span class="o"&gt;[&lt;/span&gt;push&lt;span class="o"&gt;]&lt;/span&gt;
950
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;simple
951
&lt;span class="o"&gt;[&lt;/span&gt;alias&lt;span class="o"&gt;]&lt;/span&gt;
952
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lg1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;--graph&lt;span class="w"&gt; &lt;/span&gt;--abbrev-commit&lt;span class="w"&gt; &lt;/span&gt;--decorate&lt;span class="w"&gt; &lt;/span&gt;--date&lt;span class="o"&gt;=&lt;/span&gt;relative&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s1"&gt;'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--all
953
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lg2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;--graph&lt;span class="w"&gt; &lt;/span&gt;--abbrev-commit&lt;span class="w"&gt; &lt;/span&gt;--decorate&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s1"&gt;'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--all
954
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="s2"&gt;"git lg1"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
955
&lt;/pre&gt;&lt;/div&gt;
956
957
&lt;/div&gt;
958
&lt;/div&gt;
959
&lt;/div&gt;
960
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
961
&lt;/div&gt;&lt;div class="inner_cell"&gt;
962
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
963
&lt;h4 id="~/.mrconfig"&gt;&lt;code&gt;~/.mrconfig&lt;/code&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#~/.mrconfig"&gt;&lt;/a&gt;&lt;/h4&gt;
964
&lt;/div&gt;
965
&lt;/div&gt;
966
&lt;/div&gt;
967
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
968
&lt;/div&gt;&lt;div class="inner_cell"&gt;
969
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
970
&lt;p&gt;Note: Until &lt;a href="https://myrepos.branchable.com/todo/Allow_symlinked_directories"&gt;symlinks work again&lt;/a&gt;, I can't really used myrepos.&lt;/p&gt;
971
972
&lt;/div&gt;
973
&lt;/div&gt;
974
&lt;/div&gt;
975
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
976
&lt;/div&gt;&lt;div class="inner_cell"&gt;
977
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
978
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# myrepos (mr) Config File; -*-Shell-script-*-&lt;/span&gt;
979
&lt;span class="c1"&gt;# dest = ~/.mrconfig # Keep this as the 2nd line for mmf_init_setup&lt;/span&gt;
980
&lt;span class="c1"&gt;#&lt;/span&gt;
981
&lt;span class="c1"&gt;# Requires the myrepos perl script to be installed which you can do with the&lt;/span&gt;
982
&lt;span class="c1"&gt;# following commands:&lt;/span&gt;
983
&lt;span class="c1"&gt;#&lt;/span&gt;
984
&lt;span class="c1"&gt;# mkdir -P ~/repositories&lt;/span&gt;
985
&lt;span class="c1"&gt;# git clone git://myrepos.branchable.com/ ~/repositories/myrepos&lt;/span&gt;
986
&lt;span class="c1"&gt;# pushd ~/repositories/myrepos; git checkout 52e2de0bdeb8b892c8b83fcad54543f874d4e5b8; popd&lt;/span&gt;
987
&lt;span class="c1"&gt;# ln -s ~/repositories/myrepos/mr ~/.local/bin/&lt;/span&gt;
988
&lt;span class="c1"&gt;#&lt;/span&gt;
989
&lt;span class="c1"&gt;# Also requires the mmfhg package which can be enabled by installing&lt;/span&gt;
990
&lt;span class="c1"&gt;# mmf_setup and running . mmf_setup from your .bash_aliases file.&lt;/span&gt;
991
992
&lt;span class="nv"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MMFHG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mrconfig"&lt;/span&gt;
993
994
&lt;span class="o"&gt;[&lt;/span&gt;DEFAULT&lt;span class="o"&gt;]&lt;/span&gt;
995
&lt;span class="nv"&gt;hg_out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hg&lt;span class="w"&gt; &lt;/span&gt;out
996
&lt;/pre&gt;&lt;/div&gt;
997
998
&lt;/div&gt;
999
&lt;/div&gt;
1000
&lt;/div&gt;
1001
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1002
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1003
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1004
&lt;h2 id="References"&gt;References&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#References"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
1005
&lt;li&gt;&lt;a href="https://doc.cocalc.com"&gt;CoCalc User Manual&lt;/a&gt;&lt;/li&gt;
1006
&lt;li&gt;&lt;a href="http://mostlyunixish.franzoni.eu/blog/2012/06/21/dropbox-and-mercurial-and-lived-happily-ever-after/"&gt;http://mostlyunixish.franzoni.eu/blog/2012/06/21/dropbox-and-mercurial-and-lived-happily-ever-after/&lt;/a&gt;&lt;/li&gt;
1007
&lt;/ul&gt;
1008
1009
&lt;/div&gt;
1010
&lt;/div&gt;
1011
&lt;/div&gt;
1012
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1013
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1014
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1015
&lt;h2 id="Old-Information-(Out-of-Data)"&gt;Old Information (Out of Data)&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Old-Information-(Out-of-Data)"&gt;&lt;/a&gt;&lt;/h2&gt;
1016
&lt;/div&gt;
1017
&lt;/div&gt;
1018
&lt;/div&gt;
1019
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1020
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1021
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1022
&lt;p&gt;The following information is recorded for historical purposes. It no longer applies to CoCalc.&lt;/p&gt;
1023
1024
&lt;/div&gt;
1025
&lt;/div&gt;
1026
&lt;/div&gt;
1027
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1028
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1029
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1030
&lt;h3 id="Dropbox-no-longer-works!"&gt;Dropbox &lt;a href="https://github.com/sagemathinc/cocalc/issues/11"&gt;no longer works!&lt;/a&gt;&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-no-longer-works!"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Dropbox dropped linux support for all file systems except ext4 which is not an option for CoCalc.&lt;/p&gt;
1031
&lt;p&gt;You can &lt;a href="http://ask.sagemath.org/question/10713/is-there-a-way-to-store-and-sync-the-files-from-sage-cloud-on-local-hard-drive/"&gt;use Dropbox on CoCalc&lt;/a&gt;:&lt;/p&gt;
1032
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;dropbox&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;-i
1033
&lt;/pre&gt;&lt;/div&gt;
1034
&lt;p&gt;The first time you do this, it will download some files and you will need to provide a username etc. Note, as pointed out in the link, by default, dropbox wants to share &lt;em&gt;everything&lt;/em&gt;. I am not sure of the best strategy for this, but chose to create a separate Dropbox account for the particular project I am using, then just adding the appropriate files to that account.&lt;/p&gt;
1035
&lt;p&gt;Once nice think about Dropbox is that it works well with symbolic links, so you can just symlink any files you want into the &lt;code&gt;~/Dropbox&lt;/code&gt; folder and everything should work fine, but hold off for a moment - first exclude the appropriate folders, then make the symlinks.&lt;/p&gt;
1036
&lt;p&gt;If you want to run Dropbox everytime you login, then add the following to your &lt;code&gt;~/.bash_aliases&lt;/code&gt; on CoCalc:&lt;/p&gt;
1037
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bash_aliases&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
1038
1039
&lt;span class="s"&gt;# Start Dropbox&lt;/span&gt;
1040
&lt;span class="s"&gt;dropbox start&lt;/span&gt;
1041
&lt;span class="s"&gt;EOF&lt;/span&gt;
1042
&lt;/pre&gt;&lt;/div&gt;
1043
&lt;p&gt;This did not link with my dropbox account. I had to manually kill the dropbox process, then run the following:&lt;/p&gt;
1044
&lt;pre&gt;&lt;code&gt;.dropbox-dist/dropboxd
1045
&lt;/code&gt;&lt;/pre&gt;
1046
&lt;h4 id="Dropbox-and-Version-Control"&gt;Dropbox and Version Control&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-and-Version-Control"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Although tempting, one should not use Dropbox to share VCS files since corruption might occur. Instead, you can use Dropbox to sync the working directory (for collaborators) but use selective sync to ignore the sensitive VCS files. Here is one way to do this:&lt;/p&gt;
1047
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Dropbox
1048
find&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".hg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;dropbox&lt;span class="w"&gt; &lt;/span&gt;exclude&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;
1049
find&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".git"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;dropbox&lt;span class="w"&gt; &lt;/span&gt;exclude&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;
1050
&lt;/pre&gt;&lt;/div&gt;
1051
&lt;p&gt;Note: This will remove the &lt;code&gt;.hg&lt;/code&gt; directories! (The behaviour of excluding a file with selective sync is to remove it from the local Dropbox.) Thus, my recommendation is the following:&lt;/p&gt;
1052
&lt;ol&gt;
1053
&lt;li&gt;First copy the files to the Dropbox folder using &lt;code&gt;cp -r&lt;/code&gt;.&lt;/li&gt;
1054
&lt;li&gt;Then run the previous find commands to exclude the &lt;code&gt;.hg&lt;/code&gt; directories.&lt;/li&gt;
1055
&lt;li&gt;Check this with &lt;code&gt;dropbox exclude list&lt;/code&gt;.&lt;/li&gt;
1056
&lt;li&gt;Turn off dropbox &lt;code&gt;dropbox stop&lt;/code&gt;&lt;/li&gt;
1057
&lt;li&gt;Now replace the folders with appropriate symlinks.&lt;/li&gt;
1058
&lt;li&gt;Finally, start dropbox again &lt;code&gt;dropbox start&lt;/code&gt;.&lt;/li&gt;
1059
&lt;/ol&gt;
1060
&lt;p&gt;Here is a summary for example. I am assuming that you have a version controlled project called &lt;code&gt;~/paper&lt;/code&gt; that you want mirrored in your Dropbox folder:&lt;/p&gt;
1061
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;dropbox&lt;span class="w"&gt; &lt;/span&gt;start
1062
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;~/paper&lt;span class="w"&gt; &lt;/span&gt;~/Dropbox/
1063
&lt;span class="nb"&gt;pushd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Dropbox&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;-L.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".hg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;dropbox&lt;span class="w"&gt; &lt;/span&gt;exclude&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;popd&lt;/span&gt;
1064
dropbox&lt;span class="w"&gt; &lt;/span&gt;exclude&lt;span class="w"&gt; &lt;/span&gt;list
1065
dropbox&lt;span class="w"&gt; &lt;/span&gt;stop
1066
rm&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;~/Dropbox/paper
1067
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;~/paper&lt;span class="w"&gt; &lt;/span&gt;~/Dropbox/paper
1068
dropbox&lt;span class="w"&gt; &lt;/span&gt;start
1069
&lt;/pre&gt;&lt;/div&gt;
1070
&lt;p&gt;Remember to do the same on your local computer!&lt;/p&gt;
1071
&lt;h4 id="Dropbox-Issues"&gt;Dropbox Issues&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/#Dropbox-Issues"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Occasionally there will be issues with dropbox. One of the issues may be when the host for the project changes (this happens for example when you add or remove member hosting for a project). To deal with this you might have to &lt;a href="https://www.dropbox.com/help/mobile/unlink-relink-computer-mobile"&gt;unlike or relink&lt;/a&gt; the computer to Dropbox:&lt;/p&gt;
1072
&lt;ul&gt;
1073
&lt;li&gt;&lt;strong&gt;Make sure your project has "Internet access" in Settings.&lt;/strong&gt;&lt;/li&gt;
1074
&lt;li&gt;&lt;code&gt;dropbox stop&lt;/code&gt; on the CoCalc server.&lt;/li&gt;
1075
&lt;li&gt;Sign into Dropbox with the account you have linked to the project. (Hint: if you can't remember the name, look in your main dropbox project where you should have shared this with the CoCalc project. It can be useful to use Incognito mode or a different browser to sign into an auxilliary account.)&lt;/li&gt;
1076
&lt;li&gt;Go to Settings (top right), then the Security tab.&lt;/li&gt;
1077
&lt;li&gt;In the Devices section, unlink the device.&lt;/li&gt;
1078
&lt;li&gt;Restart dropbox with &lt;code&gt;~/.dropbox-dist/dropboxd&lt;/code&gt;. This should give you a link to paste into the browser you have signed into and it will relink.&lt;/li&gt;
1079
&lt;/ul&gt;
1080
1081
&lt;/div&gt;
1082
&lt;/div&gt;
1083
&lt;/div&gt;
1084
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
1085
&lt;div class="input"&gt;
1086
&lt;div class="prompt input_prompt"&gt;In [ ]:&lt;/div&gt;
1087
&lt;div class="inner_cell"&gt;
1088
&lt;div class="input_area"&gt;
1089
&lt;div class=" highlight hl-ipython2"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;
1090
&lt;/pre&gt;&lt;/div&gt;
1091
1092
&lt;/div&gt;
1093
&lt;/div&gt;
1094
&lt;/div&gt;
1095
1096
&lt;/div&gt;</description><guid>http://swan.physics.wsu.edu/forbes/public/notes/cocalc-workflow/</guid><pubDate>Thu, 03 Mar 2016 07:20:04 GMT</pubDate></item><item><title>Details about configuring Nikola</title><link>http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/</link><dc:creator>Michael McNeil Forbes</dc:creator><description>&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1097
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1098
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1099
&lt;p&gt;This notebook contains details about various commands and techniques that might obscure the main point in the other documents.&lt;/p&gt;
1100
1101
&lt;/div&gt;
1102
&lt;/div&gt;
1103
&lt;/div&gt;
1104
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1105
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1106
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1107
&lt;h2 id="Debugging-Nikola"&gt;Debugging Nikola&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#Debugging-Nikola"&gt;&lt;/a&gt;&lt;/h2&gt;
1108
&lt;/div&gt;
1109
&lt;/div&gt;
1110
&lt;/div&gt;
1111
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1112
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1113
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1114
&lt;p&gt;Here are some tips for debugging Nikola when things go wrong.&lt;/p&gt;
1115
&lt;ul&gt;
1116
&lt;li&gt;&lt;p&gt;Run with pdb support:&lt;/p&gt;
1117
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;NIKOLA_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--pdb
1118
&lt;/pre&gt;&lt;/div&gt;
1119
&lt;p&gt;This does not halt some errors though. You can force Nikola to halt on warnings with&lt;/p&gt;
1120
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;--strict
1121
&lt;/pre&gt;&lt;/div&gt;
1122
&lt;p&gt;This will give tracebacks about the warnings that might be hidden.&lt;/p&gt;
1123
&lt;/li&gt;
1124
&lt;/ul&gt;
1125
1126
&lt;/div&gt;
1127
&lt;/div&gt;
1128
&lt;/div&gt;
1129
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1130
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1131
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1132
&lt;h2 id="Clean-Environment"&gt;Clean Environment&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#Clean-Environment"&gt;&lt;/a&gt;&lt;/h2&gt;
1133
&lt;/div&gt;
1134
&lt;/div&gt;
1135
&lt;/div&gt;
1136
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1137
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1138
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1139
&lt;p&gt;To get as clean an environment as possible, I did the following:&lt;/p&gt;
1140
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;blog3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
1141
$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;blog3
1142
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;Nikola
1143
1144
&lt;span class="c1"&gt;# Trying to run nikola build on my site gave errors requiring&lt;/span&gt;
1145
&lt;span class="c1"&gt;# the following&lt;/span&gt;
1146
&lt;span class="c1"&gt;# ModuleNotFoundError: No module named 'mmf_setup'&lt;/span&gt;
1147
&lt;span class="c1"&gt;# ERROR: Nikola: In order to use this theme, you must install the "jinja2" Python package.&lt;/span&gt;
1148
&lt;span class="c1"&gt;# ERROR: Nikola: In order to build this site (compile ipynb), you must install the "notebook&amp;gt;=4.0.0" Python package.&lt;/span&gt;
1149
1150
$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mmf_setup&lt;span class="w"&gt; &lt;/span&gt;jinja2&lt;span class="w"&gt; &lt;/span&gt;notebook
1151
1152
&lt;span class="c1"&gt;# Now we clean the environment, installing as much as possible with conda&lt;/span&gt;
1153
$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pipdeptree
1154
$&lt;span class="w"&gt; &lt;/span&gt;pipdeptree&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;perl&lt;span class="w"&gt; &lt;/span&gt;-nle&lt;span class="s1"&gt;'print if m{^\w+}'&lt;/span&gt;
1155
&lt;/pre&gt;&lt;/div&gt;
1156
1157
&lt;/div&gt;
1158
&lt;/div&gt;
1159
&lt;/div&gt;
1160
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1161
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1162
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1163
&lt;h2 id="Python-2-vs-Python-3"&gt;Python 2 vs Python 3&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#Python-2-vs-Python-3"&gt;&lt;/a&gt;&lt;/h2&gt;
1164
&lt;/div&gt;
1165
&lt;/div&gt;
1166
&lt;/div&gt;
1167
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1168
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1169
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1170
&lt;p&gt;As of 2020, Python 2 support has stopped, and all major libraries now support Python 3. This includes Mercurial as of version 5.2, our main reason for holding back. Thus, at this point, I strongly recommend starting from Python 3. The remaining material here is for historical reasons.&lt;/p&gt;
1171
&lt;p&gt;Discussions here:&lt;/p&gt;
1172
&lt;ul&gt;
1173
&lt;li&gt;&lt;a href="https://wiki.python.org/moin/Python2orPython3"&gt;https://wiki.python.org/moin/Python2orPython3&lt;/a&gt;&lt;/li&gt;
1174
&lt;li&gt;&lt;a href="https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/WdS85V816rw"&gt;https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/WdS85V816rw&lt;/a&gt;&lt;/li&gt;
1175
&lt;/ul&gt;
1176
&lt;p&gt;One issue is that &lt;a href="http://mercurial.selenic.com/wiki/SupportedPythonVersions#Python_3.x_support"&gt;mercurial requires Python 2&lt;/a&gt; and likely will not support Python 3 for some time. This means that we will have to get users to install Mercurial separately as part of their OS.&lt;/p&gt;
1177
&lt;p&gt;Since I often want control of Mercurial, I still would like to install it under conda. Here is how I do it:&lt;/p&gt;
1178
&lt;ol&gt;
1179
&lt;li&gt;&lt;p&gt;Install Miniconda (see below) with &lt;code&gt;python=2&lt;/code&gt; into &lt;code&gt;/data/apps/anaconda/bin&lt;/code&gt;.&lt;/p&gt;
1180
&lt;/li&gt;
1181
&lt;li&gt;&lt;p&gt;&lt;code&gt;conda install mercurial&lt;/code&gt;. This gives me a working version.&lt;/p&gt;
1182
&lt;/li&gt;
1183
&lt;li&gt;&lt;p&gt;&lt;code&gt;conda create -n talent2012 python=3 anaconda&lt;/code&gt;. This is my python 3 working environment.&lt;/p&gt;
1184
&lt;/li&gt;
1185
&lt;li&gt;&lt;p&gt;Make sure that &lt;code&gt;/data/apps/anaconda/bin&lt;/code&gt; appears at both the start and end of my path. For example:&lt;/p&gt;
1186
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/data/apps/anaconda/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;:/data/apps/anaconda/bin/./"&lt;/span&gt;
1187
&lt;/pre&gt;&lt;/div&gt;
1188
&lt;/li&gt;
1189
&lt;/ol&gt;
1190
&lt;p&gt;This little trick ensures that when I activate a new environment, the default &lt;code&gt;bin&lt;/code&gt; directory remains on my path after so that &lt;code&gt;hg&lt;/code&gt; can fallback and still work:&lt;/p&gt;
1191
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;talent2015
1192
discarding&lt;span class="w"&gt; &lt;/span&gt;/data/apps/anaconda/bin&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;PATH
1193
prepending&lt;span class="w"&gt; &lt;/span&gt;/data/apps/anaconda/envs/talent2015/bin&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;PATH
1194
&lt;span class="o"&gt;(&lt;/span&gt;talent2015&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
1195
/data/apps/anaconda/envs/talent2015/bin:...:/data/apps/anaconda/bin/./
1196
&lt;/pre&gt;&lt;/div&gt;
1197
1198
&lt;/div&gt;
1199
&lt;/div&gt;
1200
&lt;/div&gt;
1201
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1202
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1203
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1204
&lt;h2 id="Conda"&gt;Conda&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#Conda"&gt;&lt;/a&gt;&lt;/h2&gt;
1205
&lt;/div&gt;
1206
&lt;/div&gt;
1207
&lt;/div&gt;
1208
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1209
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1210
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1211
&lt;ul&gt;
1212
&lt;li&gt;&lt;code&gt;conda install&lt;/code&gt; seems to also do a &lt;code&gt;conda update&lt;/code&gt;, so use this in examples if you are not certain the user has installed the package (in which case &lt;code&gt;conda update&lt;/code&gt; will fail).&lt;/li&gt;
1213
&lt;/ul&gt;
1214
1215
&lt;/div&gt;
1216
&lt;/div&gt;
1217
&lt;/div&gt;
1218
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1219
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1220
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1221
&lt;h3 id="Clean-Environment-(for-Developers)"&gt;Clean Environment (for Developers)&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#Clean-Environment-(for-Developers)"&gt;&lt;/a&gt;&lt;/h3&gt;
1222
&lt;/div&gt;
1223
&lt;/div&gt;
1224
&lt;/div&gt;
1225
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1226
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1227
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1228
&lt;p&gt;If you are developing code, then it is important to have a clean environment so you don't accidentally depend on packages that you forget to tell the students to install. This can be done as follows. (Not everyone needs to add this complication – we just need to make sure that a few people test all the code in a clean environment.) Here is how I am doing this now (MMF):&lt;/p&gt;
1229
&lt;ol&gt;
1230
&lt;li&gt;&lt;p&gt;First I installed a clean version of &lt;a href="http://conda.pydata.org/miniconda.html"&gt;Miniconda&lt;/a&gt; based on Python 2 so that I can use mercurial. This is the minimal package manager without any additional dependencies. The reason is that any environments you create will have access to the packages installed in the root (default) and I would like to be able to test code &lt;em&gt;without&lt;/em&gt; the full anaconda distribution. Since we require the full &lt;a href="https://store.continuum.io/cshop/anaconda/"&gt;Anaconda&lt;/a&gt; distribution here, it is fine to install it instead if you don't care about testing your code in clean environment.&lt;/p&gt;
1231
&lt;p&gt;I install mine in a global location &lt;code&gt;/data/apps/anaconda&lt;/code&gt;. (This path will appear in examples below. Modify to match your installation choice. I believe the default is your home directory &lt;code&gt;~/miniconda&lt;/code&gt; or &lt;code&gt;~/anaconda&lt;/code&gt;.) To use this, you need to add the appropriate directory to your path. The installer will offer to do this for you but if you customize your startup files, you might need to intervene a little. Make sure that something like this appears in your &lt;code&gt;~/.bash_profile&lt;/code&gt; or &lt;code&gt;~/.bashrc&lt;/code&gt; file:&lt;/p&gt;
1232
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;
1233
&lt;/pre&gt;&lt;/div&gt;
1234
&lt;/li&gt;
1235
&lt;/ol&gt;
1236
&lt;p&gt;export PATH="/data/apps/anaconda/bin:$PATH:/data/apps/anaconda/bin/./"
1237
export DYLD_LIBRARY_PATH "/data/apps/anaconda/anaconda/lib:$DYLD_LIBRARY_PATH"&lt;/p&gt;
1238
&lt;pre&gt;&lt;code&gt;
1239
(The library path is useful if you install shared libraries like the [FFTW](http://www.fftw.org) and want to manage them with ``conda``. *Someone with Linux expertise, please add the appropriate environmental exports for the linux platform.*)
1240
2. Next I create various environments for working with different versions of python, etc. For this project I do:
1241
1242
```bash
1243
conda create -n py2 python=2
1244
conda create -n py3 python=3
1245
conda create -n anaconda2 anaconda
1246
conda create -n anaconda3 anaconda python=3
1247
conda create -n talent2015 python=3 anaconda
1248
&lt;/code&gt;&lt;/pre&gt;
1249
&lt;p&gt;This creates a new full anaconda distribution in the environment named &lt;code&gt;talent2015&lt;/code&gt;. To use this you activate it with one of (requires &lt;code&gt;bash&lt;/code&gt; or &lt;code&gt;zsh&lt;/code&gt;):&lt;/p&gt;
1250
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;talent2015
1251
&lt;span class="c1"&gt;# OR&lt;/span&gt;
1252
.&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;talent2015&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# The "." is a shortcut for "source"&lt;/span&gt;
1253
&lt;/pre&gt;&lt;/div&gt;
1254
&lt;p&gt;All this really does is modify your &lt;code&gt;PATH&lt;/code&gt; to point to &lt;code&gt;/data/apps/anaconda/envs/talent2015/bin&lt;/code&gt;. When you are finished, you can deactivate this with:&lt;/p&gt;
1255
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;deactivate
1256
&lt;/pre&gt;&lt;/div&gt;
1257
1258
&lt;/div&gt;
1259
&lt;/div&gt;
1260
&lt;/div&gt;
1261
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1262
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1263
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1264
&lt;h2 id="New-Posts"&gt;New Posts&lt;a class="anchor-link" href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/#New-Posts"&gt;&lt;/a&gt;&lt;/h2&gt;
1265
&lt;/div&gt;
1266
&lt;/div&gt;
1267
&lt;/div&gt;
1268
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1269
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1270
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1271
&lt;p&gt;There appears to be no easy way to customize new posts. In particular, as of version 7.7.6 I tried to modify the template to insert &lt;code&gt;&amp;lt;!-- TEASER_END --&amp;gt;&lt;/code&gt; after the content. I traced this to line 141 in &lt;code&gt;nikola/plugins/compile/ipynb.py&lt;/code&gt; which inserts the &lt;code&gt;content&lt;/code&gt;. The actual content is a translated version of "Write your post here." and everything is inserted programatically without any apparent opportunity for customization.&lt;/p&gt;
1272
&lt;p&gt;In order to customize this, I use a custom script for starting new posts:&lt;/p&gt;
1273
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Creates a new blog post&lt;/span&gt;
1274
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;np&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
1275
&lt;span class="o"&gt;{&lt;/span&gt;
1276
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/Users/mforbes/current/website/posts/private_blog/
1277
&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;blog
1278
&lt;span class="w"&gt; &lt;/span&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;new_post&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;/Users/mforbes/current/website/new_post_content.md
1279
&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;work
1280
&lt;span class="o"&gt;}&lt;/span&gt;
1281
&lt;/pre&gt;&lt;/div&gt;
1282
&lt;p&gt;Then I place the following content in the file &lt;code&gt;/Users/mforbes/current/website/new_post_content.md&lt;/code&gt;:&lt;/p&gt;
1283
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;![&lt;span class="nt"&gt;Figure Description&lt;/span&gt;](&lt;span class="na"&gt;/images/Figure.png&lt;/span&gt;)
1284
&lt;span class="gh"&gt;# Title&lt;/span&gt;
1285
Write your post here!
1286
&amp;lt;!-- TEASER_END --&amp;gt;
1287
&lt;/pre&gt;&lt;/div&gt;
1288
&lt;p&gt;Note: In order for this to work, I needed to make sure that the markdown compiler was not disabled. To do this, I made sure that in my &lt;code&gt;conf.py&lt;/code&gt; file, I had at least one reference to markdown (I did this in my pages list:)&lt;/p&gt;
1289
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
1290
&lt;span class="n"&gt;PAGES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
1291
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pages/*.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"story.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
1292
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pages/*.rst"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"story.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
1293
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pages/*.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"story.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
1294
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pages/*.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"story.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
1295
&lt;span class="p"&gt;)&lt;/span&gt;
1296
&lt;/pre&gt;&lt;/div&gt;
1297
1298
&lt;/div&gt;
1299
&lt;/div&gt;
1300
&lt;/div&gt;
1301
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
1302
&lt;div class="input"&gt;
1303
&lt;div class="prompt input_prompt"&gt;In [ ]:&lt;/div&gt;
1304
&lt;div class="inner_cell"&gt;
1305
&lt;div class="input_area"&gt;
1306
&lt;div class=" highlight hl-ipython2"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;
1307
&lt;/pre&gt;&lt;/div&gt;
1308
1309
&lt;/div&gt;
1310
&lt;/div&gt;
1311
&lt;/div&gt;
1312
1313
&lt;/div&gt;</description><guid>http://swan.physics.wsu.edu/forbes/public/notes/nikola-details/</guid><pubDate>Wed, 02 Mar 2016 18:20:04 GMT</pubDate></item><item><title>Installing Nikola</title><link>http://swan.physics.wsu.edu/forbes/public/notes/nikola-install/</link><dc:creator>Michael McNeil Forbes</dc:creator><description>&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
1314
&lt;/div&gt;&lt;div class="inner_cell"&gt;
1315
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
1316
&lt;p&gt;Using Nikola to blog with ipython notebooks.&lt;/p&gt;
1317
&lt;p&gt;&lt;a href="http://www.damian.oquanta.info/posts/ipython-plugin-for-nikola-updated.html"&gt;http://www.damian.oquanta.info/posts/ipython-plugin-for-nikola-updated.html&lt;/a&gt;&lt;/p&gt;
1318
&lt;p&gt;&lt;a href="http://swan.physics.wsu.edu/forbes/public/notes/nikola-install/"&gt;Read more…&lt;/a&gt; (24 min remaining to read)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><guid>http://swan.physics.wsu.edu/forbes/public/notes/nikola-install/</guid><pubDate>Wed, 02 Mar 2016 18:20:00 GMT</pubDate></item></channel></rss>
1319