From db6b432a95cad4eba30b614b042a94604b128575 Mon Sep 17 00:00:00 2001 From: Andrey Novoseltsev Date: Sun, 19 May 2024 20:13:16 +0000 Subject: [PATCH] deploy updates --- .buildinfo | 2 +- _sources/compute_server.rst.txt | 55 ++++++- _static/basic.css | 2 +- _static/doctools.js | 2 +- _static/language_data.js | 4 +- _static/searchtools.js | 165 +++++++++++++------- account-dropdown.html | 2 +- account-toolbar.html | 2 +- account/licenses.html | 2 +- account/preferences.html | 2 +- account/public-files.html | 2 +- account/purchases.html | 2 +- account/ssh.html | 2 +- account/support.html | 2 +- activity-bar.html | 2 +- ai.html | 2 +- api-examples.html | 2 +- api/add_collaborator.html | 2 +- api/add_license_to_project.html | 2 +- api/change_email_address.html | 2 +- api/change_password.html | 2 +- api/copy_path_between_projects.html | 2 +- api/copy_path_delete.html | 2 +- api/copy_path_status.html | 2 +- api/copy_public_path_between_projects.html | 2 +- api/create_account.html | 2 +- api/create_project.html | 2 +- api/create_support_ticket.html | 2 +- api/delete_account.html | 2 +- api/disconnect_from_project.html | 2 +- api/forgot_password.html | 2 +- api/get_available_upgrades.html | 2 +- api/get_support_tickets.html | 2 +- api/get_usernames.html | 2 +- api/index.html | 2 +- api/index0.html | 2 +- api/invite_collaborator.html | 2 +- api/invite_noncloud_collaborators.html | 2 +- api/log_client_error.html | 2 +- api/metrics.html | 2 +- api/ping.html | 2 +- api/project_exec.html | 2 +- api/public_get_text_file.html | 2 +- api/query.html | 2 +- api/read_text_file_from_project.html | 2 +- api/remove_collaborator.html | 2 +- api/remove_license_from_project.html | 2 +- api/reset_forgot_password.html | 2 +- api/start_metrics.html | 2 +- api/touch_project.html | 2 +- api/unlink_passport.html | 2 +- api/user_auth.html | 2 +- api/user_search.html | 2 +- api/write_text_file_to_project.html | 2 +- api2/directory-listing.html | 2 +- api2/email-address-from-account-id.html | 2 +- api2/get-purchases.html | 2 +- api2/index.html | 2 +- api2/latex.html | 2 +- api2/purchasing-licenses.html | 2 +- api2/stop.html | 2 +- api2/user-query.html | 2 +- apikeys.html | 2 +- backups.html | 2 +- billing.html | 2 +- chat.html | 2 +- chatgpt.html | 2 +- cocalc-cloud.html | 2 +- cocalc-desktop.html | 2 +- compute_server.html | 173 ++++++++++++++------- contents.html | 2 +- csv-viewer.html | 2 +- display-options.html | 2 +- explorer.html | 2 +- files-search.html | 2 +- flyouts.html | 2 +- frame-editor.html | 2 +- genindex.html | 2 +- getting-started.html | 2 +- howto/activeloop-hub.html | 2 +- howto/assembly-language.html | 2 +- howto/awscli.html | 2 +- howto/bash-fortunes.html | 2 +- howto/bokeh-server.html | 2 +- howto/cant-save.html | 2 +- howto/clock-is-off.html | 2 +- howto/connectivity-issues.html | 2 +- howto/convert-html-to-pdf.html | 2 +- howto/cplusplus.html | 2 +- howto/custom-jupyter-kernel.html | 2 +- howto/dask.html | 2 +- howto/disk-space-warning.html | 2 +- howto/export-timetravel.html | 2 +- howto/external-tools.html | 2 +- howto/file-too-large.html | 2 +- howto/firewall-info.html | 2 +- howto/fix-broken-jupyter-pdf.html | 2 +- howto/fortran.html | 2 +- howto/front-end-dev.html | 2 +- howto/gap-kernel-unavailable.html | 2 +- howto/git.html | 2 +- howto/google-api.html | 2 +- howto/gsl.html | 2 +- howto/index.html | 2 +- howto/install-julia-package.html | 2 +- howto/install-python-lib.html | 2 +- howto/install-r-package.html | 2 +- howto/jupyter-extension.html | 2 +- howto/jupyter-kernel-selection.html | 2 +- howto/jupyter-kernel-terminated.html | 2 +- howto/jupyter-plot-png-svg.html | 2 +- howto/jupyterlab-extensions.html | 2 +- howto/license-doesnt-work.html | 2 +- howto/low-memory.html | 2 +- howto/missing-project.html | 2 +- howto/mongodb.html | 2 +- howto/multiple-accounts.html | 2 +- howto/nbgrader.html | 2 +- howto/neuron.html | 2 +- howto/octave.html | 2 +- howto/orphan.html | 2 +- howto/overleaf.html | 2 +- howto/parallel.html | 2 +- howto/plotly-dash.html | 2 +- howto/pluto.html | 2 +- howto/postgresql.html | 2 +- howto/project-invitation-tokens.html | 2 +- howto/recover-deleted-file.html | 2 +- howto/remarkjs-slideshow.html | 2 +- howto/ruby.html | 2 +- howto/run-r-step-by-step.html | 2 +- howto/running-processes.html | 2 +- howto/sage-question.html | 2 +- howto/shiny-server.html | 2 +- howto/slow-worksheet.html | 2 +- howto/software-development.html | 2 +- howto/streamlit.html | 2 +- howto/sudo-make-install.html | 2 +- howto/trouble.html | 2 +- howto/turtle.html | 2 +- howto/upload.html | 2 +- howto/webserver.html | 2 +- index.html | 2 +- introduction.html | 2 +- ipad.html | 2 +- jupyter-classical-vs-cocalc.html | 2 +- jupyter-enhancements.html | 2 +- jupyter-start.html | 2 +- jupyter-tips-and-tricks.html | 2 +- jupyter.html | 2 +- latex-faq.html | 2 +- latex-features.html | 2 +- latex-start.html | 2 +- latex.html | 2 +- licenses.html | 2 +- markdown.html | 2 +- news.html | 2 +- news/ubuntu-2004.html | 2 +- objects.inv | Bin 11160 -> 11195 bytes on-premises.html | 2 +- paygo.html | 2 +- platform-news.html | 2 +- platform.html | 2 +- plus-new.html | 2 +- processes.html | 2 +- project-faq.html | 2 +- project-files.html | 2 +- project-home.html | 2 +- project-init.html | 2 +- project-library.html | 2 +- project-list.html | 2 +- project-log.html | 2 +- project-settings.html | 2 +- project-toolbar.html | 2 +- project.html | 2 +- references.html | 2 +- restrict-student-projects.html | 2 +- rich-text.html | 2 +- sagews.html | 2 +- search.html | 2 +- searchindex.js | 2 +- servers.html | 2 +- service_options.html | 12 +- share.html | 2 +- sitemap.xml | 2 +- slides.html | 2 +- snippets.html | 2 +- software.html | 2 +- software/custom_software.html | 2 +- software/custom_software0.html | 2 +- software/updates-2018.html | 2 +- software/updates-2019.html | 2 +- software/updates-2020.html | 2 +- software/updates-2021.html | 2 +- software/updates-2022.html | 2 +- software/updates-2023.html | 2 +- software/updates-2024.html | 2 +- tasks.html | 2 +- teaching-after-course.html | 2 +- teaching-course-management.html | 2 +- teaching-create-course.html | 2 +- teaching-instructors.html | 2 +- teaching-interactions.html | 2 +- teaching-nbgrader.html | 2 +- teaching-students.html | 2 +- teaching-tips_and_tricks.html | 2 +- teaching-upgrade-course.html | 2 +- teaching-upgrade-legacy.html | 2 +- teaching-workshop.html | 2 +- terminal.html | 2 +- time-travel.html | 2 +- timers.html | 2 +- tours.html | 2 +- trial.html | 2 +- update-credit-card.html | 2 +- upgrade-guide.html | 2 +- upgrades.html | 2 +- user_interface.html | 2 +- users.html | 2 +- vouchers.html | 2 +- vscode.html | 2 +- whiteboard.html | 2 +- working_with.html | 2 +- x11.html | 2 +- 224 files changed, 511 insertions(+), 334 deletions(-) diff --git a/.buildinfo b/.buildinfo index be42b4ae..ebfbb723 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: fa933f26a799a3927184091d20e0a171 +config: c55d10c349631b6f54444660f7b5c79a tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_sources/compute_server.rst.txt b/_sources/compute_server.rst.txt index f8270784..75f54af6 100644 --- a/_sources/compute_server.rst.txt +++ b/_sources/compute_server.rst.txt @@ -76,7 +76,7 @@ There are multiple ways to create a compute server, one of them is to click the Creating a Compute Server -The first settings allow you to give your server a name, pick a colour to easily distinguish where your are working, and **choose the cloud provider** used for your server: +The first settings allow you to give your server a name, pick a colour to easily distinguish where your are working, and :ref:`choose the cloud provider ` used for your server: .. figure:: img/compute_server_create_dialog.png :width: 90% @@ -276,6 +276,59 @@ When you edit files via CoCalc graphical interface, they are usually synced betw Sync Files Button for a Compute Server +.. _choosing_a_cloud: + +Choosing a Cloud +------------------ + +It is impossible to choose "the best cloud" for compute servers overall, that is why CoCalc integrates with many of them! For each particular use case one may be more or less preferable - sometimes it may be obvious, sometimes it requires experimentation, and sometimes the difference is inconsequential. The purpose of this section is to highlight some points to consider when choosing a cloud, hopefully it will make this task easier for you. + +Cost +.... + +This may be the most obvious criterion, but while we strive to be as transparent as possible with the cost of running a compute server, do keep in mind also that: + +- there is a cost for the disk space when the server is off; +- there may be some charge for network traffic, typically it is small compared to compute resources, but it does depend on your use case; +- it may be more cost effective to use a configuration that is more expensive *per hour* if it allows you to complete your computations faster, thus paying for fewer hours. + +Availability +............ + +This one may be less obvious than the cost, but it is even more important - the price of a computer server does not matter if you cannot start it! In most cases once you managed to start a compute server, you can continue using it until you explicitly turn it off. However, there is no guarantee that you will be able to start the same machine again in a few days - other users may utilize all resources. + +Geographic location +................... + +Your organization may have particular restrictions on where your data are located. If you expect a lot of network traffic, it may be beneficial to choose a data centre close to your users. For interactive work you may want to start a compute server close to you to reduce latency. + +Special Considerations +...................... + +You may want to use a data centre satisfying particular requirements on sustainability, security, etc. We try to expose as much information about our cloud providers as possible to help our users to make an informed choice. + +Let's take a look now at some of the unique benefits of our cloud providers! + +Google +...... + +- Vast selection of varied configurations! +- For computationally intensive tasks, do take a look at higher end machines. We had customers with very strict requirements on interconnect network between cluster nodes, but it turned out that Google had single nodes with enough vCPUs, eliminating the need for a cluster setup! +- Spot instances offer up to 10x lower prices, if your work can deal with potential interruptions! + +Hyperstack +.......... + +- Apart from cost and speed, Hyperstack prioritizes sustainability of their data centres. They are 100% powered by hydro-electricity and are located in Canada and Norway to benefit from lower ambient temperature for air cooling. +- You can see how many GPUs are available on Hyperstack at any given time and estimate your chances of being able to get what you need in the future. + +On Prem +....... + +- You are in full control of the machine you are using. +- At the moment On Prem compute servers are free, the intended cost when their development is finished is about 1/3 of a similar spot instance on Google. If you *already own* sufficient compute resources, this may be the most cost-effective option to benefit from the cloud and collaboration as well! + + .. _teaching_with_compute_servers: Teaching with Compute Servers diff --git a/_static/basic.css b/_static/basic.css index 30fee9d0..f316efcb 100644 --- a/_static/basic.css +++ b/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/_static/doctools.js b/_static/doctools.js index d06a71d7..4d67807d 100644 --- a/_static/doctools.js +++ b/_static/doctools.js @@ -4,7 +4,7 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/_static/language_data.js b/_static/language_data.js index 250f5665..367b8ed8 100644 --- a/_static/language_data.js +++ b/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,7 +13,7 @@ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; -/* Non-minified version is copied as a separate JS file, is available */ +/* Non-minified version is copied as a separate JS file, if available */ /** * Porter Stemmer diff --git a/_static/searchtools.js b/_static/searchtools.js index 7918c3fa..92da3f8b 100644 --- a/_static/searchtools.js +++ b/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => { .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) + Search.makeSearchSummary(data, searchTerms, anchor) ); // highlight search terms in the summary if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js @@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => { ); else Search.status.innerText = _( - `Search finished, found ${resultCount} page(s) matching the search query.` - ); + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( results, @@ -137,6 +137,22 @@ const _displayNextItem = ( // search finished, update title and status message else _finishSearch(resultCount); }; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a @@ -160,13 +176,26 @@ const Search = { _queued_query: null, _pulse_status: -1, - htmlToText: (htmlString) => { + htmlToText: (htmlString, anchor) => { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent !== undefined) return docContent.textContent; + if (docContent) return docContent.textContent; + console.warn( - "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." ); return ""; }, @@ -239,16 +268,7 @@ const Search = { else Search.deferQuery(query); }, - /** - * execute search (requires search index to be loaded) - */ - query: (query) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - + _parseQuery: (query) => { // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -284,16 +304,32 @@ const Search = { // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); - // array of [docname, title, anchor, descr, score, filename] - let results = []; + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + _removeChildren(document.getElementById("search-progress")); - const queryLower = query.toLowerCase(); + const queryLower = query.toLowerCase().trim(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { let score = Math.round(100 * queryLower.length / title.length) - results.push([ + normalResults.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, id !== null ? "#" + id : "", @@ -308,46 +344,47 @@ const Search = { // search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id] of foundEntries) { - let score = Math.round(100 * queryLower.length / entry.length) - results.push([ + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ docNames[file], titles[file], id ? "#" + id : "", null, score, filenames[file], - ]); + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } } } } // lookup as object objectTerms.forEach((term) => - results.push(...Search.performObjectSearch(term, objectTerms)) + normalResults.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext - results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function - if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); - - // now sort the results by score (in opposite order of appearance, since the - // display function below uses pop() to retrieve items) and then - // alphabetically - results.sort((a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; - }); + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept @@ -361,7 +398,12 @@ const Search = { return acc; }, []); - results = results.reverse(); + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); // for debugging //Search.lastresults = results.slice(); // a copy @@ -466,14 +508,18 @@ const Search = { // add support for partial matches if (word.length > 2) { const escapedWord = _escapeRegExp(word); - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord) && !terms[word]) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord) && !titleTerms[word]) - arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); - }); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } } // no match but word was a required one @@ -496,9 +542,8 @@ const Search = { // create the mapping files.forEach((file) => { - if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - else fileMap.set(file, [word]); + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); }); }); @@ -549,8 +594,8 @@ const Search = { * search summary for a given text. keywords is a list * of stemmed words. */ - makeSearchSummary: (htmlText, keywords) => { - const text = Search.htmlToText(htmlText); + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); if (text === "") return null; const textLower = text.toLowerCase(); diff --git a/account-dropdown.html b/account-dropdown.html index dcc96a0b..398ffa1f 100644 --- a/account-dropdown.html +++ b/account-dropdown.html @@ -19,7 +19,7 @@ - + diff --git a/account-toolbar.html b/account-toolbar.html index 8d9861cf..adc90849 100644 --- a/account-toolbar.html +++ b/account-toolbar.html @@ -19,7 +19,7 @@ - + diff --git a/account/licenses.html b/account/licenses.html index 2fa853fb..1aaee5e8 100644 --- a/account/licenses.html +++ b/account/licenses.html @@ -19,7 +19,7 @@ - + diff --git a/account/preferences.html b/account/preferences.html index b5de1f9f..3711680c 100644 --- a/account/preferences.html +++ b/account/preferences.html @@ -19,7 +19,7 @@ - + diff --git a/account/public-files.html b/account/public-files.html index 3e2a908d..d1ca26a3 100644 --- a/account/public-files.html +++ b/account/public-files.html @@ -19,7 +19,7 @@ - + diff --git a/account/purchases.html b/account/purchases.html index 5a45af01..52fb2126 100644 --- a/account/purchases.html +++ b/account/purchases.html @@ -19,7 +19,7 @@ - + diff --git a/account/ssh.html b/account/ssh.html index 8251a20b..95e2e65d 100644 --- a/account/ssh.html +++ b/account/ssh.html @@ -19,7 +19,7 @@ - + diff --git a/account/support.html b/account/support.html index f619e24a..2bf00b25 100644 --- a/account/support.html +++ b/account/support.html @@ -19,7 +19,7 @@ - + diff --git a/activity-bar.html b/activity-bar.html index fa12ca00..8bf1a891 100644 --- a/activity-bar.html +++ b/activity-bar.html @@ -19,7 +19,7 @@ - + diff --git a/ai.html b/ai.html index 681d792c..a2427432 100644 --- a/ai.html +++ b/ai.html @@ -19,7 +19,7 @@ - + diff --git a/api-examples.html b/api-examples.html index 61a34979..8ae13ed3 100644 --- a/api-examples.html +++ b/api-examples.html @@ -19,7 +19,7 @@ - + diff --git a/api/add_collaborator.html b/api/add_collaborator.html index 5bff15e1..5fb94d65 100644 --- a/api/add_collaborator.html +++ b/api/add_collaborator.html @@ -19,7 +19,7 @@ - + diff --git a/api/add_license_to_project.html b/api/add_license_to_project.html index 14eac10c..9dd0e197 100644 --- a/api/add_license_to_project.html +++ b/api/add_license_to_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/change_email_address.html b/api/change_email_address.html index d16902c3..6ab0d1ac 100644 --- a/api/change_email_address.html +++ b/api/change_email_address.html @@ -19,7 +19,7 @@ - + diff --git a/api/change_password.html b/api/change_password.html index a92fece1..23e57efc 100644 --- a/api/change_password.html +++ b/api/change_password.html @@ -19,7 +19,7 @@ - + diff --git a/api/copy_path_between_projects.html b/api/copy_path_between_projects.html index 4290b54b..94cda8f9 100644 --- a/api/copy_path_between_projects.html +++ b/api/copy_path_between_projects.html @@ -19,7 +19,7 @@ - + diff --git a/api/copy_path_delete.html b/api/copy_path_delete.html index 439759cd..7064f4a3 100644 --- a/api/copy_path_delete.html +++ b/api/copy_path_delete.html @@ -19,7 +19,7 @@ - + diff --git a/api/copy_path_status.html b/api/copy_path_status.html index a1a02bee..5cd73406 100644 --- a/api/copy_path_status.html +++ b/api/copy_path_status.html @@ -19,7 +19,7 @@ - + diff --git a/api/copy_public_path_between_projects.html b/api/copy_public_path_between_projects.html index 7755e2e1..f3550634 100644 --- a/api/copy_public_path_between_projects.html +++ b/api/copy_public_path_between_projects.html @@ -19,7 +19,7 @@ - + diff --git a/api/create_account.html b/api/create_account.html index 90681f51..c8a70dcc 100644 --- a/api/create_account.html +++ b/api/create_account.html @@ -19,7 +19,7 @@ - + diff --git a/api/create_project.html b/api/create_project.html index 90226dff..9c67ea5e 100644 --- a/api/create_project.html +++ b/api/create_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/create_support_ticket.html b/api/create_support_ticket.html index 38c48445..13c4dbdd 100644 --- a/api/create_support_ticket.html +++ b/api/create_support_ticket.html @@ -19,7 +19,7 @@ - + diff --git a/api/delete_account.html b/api/delete_account.html index 79db5a93..083acf55 100644 --- a/api/delete_account.html +++ b/api/delete_account.html @@ -19,7 +19,7 @@ - + diff --git a/api/disconnect_from_project.html b/api/disconnect_from_project.html index 6dec7b07..9c0ea1c5 100644 --- a/api/disconnect_from_project.html +++ b/api/disconnect_from_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/forgot_password.html b/api/forgot_password.html index 5cb56db3..45109393 100644 --- a/api/forgot_password.html +++ b/api/forgot_password.html @@ -19,7 +19,7 @@ - + diff --git a/api/get_available_upgrades.html b/api/get_available_upgrades.html index 14f1e9c3..7b02ef0d 100644 --- a/api/get_available_upgrades.html +++ b/api/get_available_upgrades.html @@ -19,7 +19,7 @@ - + diff --git a/api/get_support_tickets.html b/api/get_support_tickets.html index 702f65bd..c7280a5f 100644 --- a/api/get_support_tickets.html +++ b/api/get_support_tickets.html @@ -19,7 +19,7 @@ - + diff --git a/api/get_usernames.html b/api/get_usernames.html index f9e5895e..b908c00b 100644 --- a/api/get_usernames.html +++ b/api/get_usernames.html @@ -19,7 +19,7 @@ - + diff --git a/api/index.html b/api/index.html index c5417c65..9978165a 100644 --- a/api/index.html +++ b/api/index.html @@ -19,7 +19,7 @@ - + diff --git a/api/index0.html b/api/index0.html index d8e5325d..30a76d9e 100644 --- a/api/index0.html +++ b/api/index0.html @@ -19,7 +19,7 @@ - + diff --git a/api/invite_collaborator.html b/api/invite_collaborator.html index 84cd1671..5d332eb7 100644 --- a/api/invite_collaborator.html +++ b/api/invite_collaborator.html @@ -19,7 +19,7 @@ - + diff --git a/api/invite_noncloud_collaborators.html b/api/invite_noncloud_collaborators.html index a0018947..5ae07afb 100644 --- a/api/invite_noncloud_collaborators.html +++ b/api/invite_noncloud_collaborators.html @@ -19,7 +19,7 @@ - + diff --git a/api/log_client_error.html b/api/log_client_error.html index 8e9603eb..f4ee9fa9 100644 --- a/api/log_client_error.html +++ b/api/log_client_error.html @@ -19,7 +19,7 @@ - + diff --git a/api/metrics.html b/api/metrics.html index 4cf4c19c..89f083c5 100644 --- a/api/metrics.html +++ b/api/metrics.html @@ -19,7 +19,7 @@ - + diff --git a/api/ping.html b/api/ping.html index bf41d655..c81e928c 100644 --- a/api/ping.html +++ b/api/ping.html @@ -19,7 +19,7 @@ - + diff --git a/api/project_exec.html b/api/project_exec.html index 81f4c616..f344ca37 100644 --- a/api/project_exec.html +++ b/api/project_exec.html @@ -19,7 +19,7 @@ - + diff --git a/api/public_get_text_file.html b/api/public_get_text_file.html index 12dc23b8..4311f17e 100644 --- a/api/public_get_text_file.html +++ b/api/public_get_text_file.html @@ -19,7 +19,7 @@ - + diff --git a/api/query.html b/api/query.html index f31b522c..28d137fc 100644 --- a/api/query.html +++ b/api/query.html @@ -19,7 +19,7 @@ - + diff --git a/api/read_text_file_from_project.html b/api/read_text_file_from_project.html index a543ac21..7f49dddb 100644 --- a/api/read_text_file_from_project.html +++ b/api/read_text_file_from_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/remove_collaborator.html b/api/remove_collaborator.html index 9e465f6b..bb16b34d 100644 --- a/api/remove_collaborator.html +++ b/api/remove_collaborator.html @@ -19,7 +19,7 @@ - + diff --git a/api/remove_license_from_project.html b/api/remove_license_from_project.html index 76260e2c..ba7ad49c 100644 --- a/api/remove_license_from_project.html +++ b/api/remove_license_from_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/reset_forgot_password.html b/api/reset_forgot_password.html index 69fb4a42..8e392378 100644 --- a/api/reset_forgot_password.html +++ b/api/reset_forgot_password.html @@ -19,7 +19,7 @@ - + diff --git a/api/start_metrics.html b/api/start_metrics.html index 02c94ee7..3347bc3d 100644 --- a/api/start_metrics.html +++ b/api/start_metrics.html @@ -19,7 +19,7 @@ - + diff --git a/api/touch_project.html b/api/touch_project.html index 6404aa1f..ddc7f030 100644 --- a/api/touch_project.html +++ b/api/touch_project.html @@ -19,7 +19,7 @@ - + diff --git a/api/unlink_passport.html b/api/unlink_passport.html index 4e573b37..5322930f 100644 --- a/api/unlink_passport.html +++ b/api/unlink_passport.html @@ -19,7 +19,7 @@ - + diff --git a/api/user_auth.html b/api/user_auth.html index b8815834..bb974ddc 100644 --- a/api/user_auth.html +++ b/api/user_auth.html @@ -19,7 +19,7 @@ - + diff --git a/api/user_search.html b/api/user_search.html index 613a1d66..50686f8a 100644 --- a/api/user_search.html +++ b/api/user_search.html @@ -19,7 +19,7 @@ - + diff --git a/api/write_text_file_to_project.html b/api/write_text_file_to_project.html index a1232d8b..2c4ef488 100644 --- a/api/write_text_file_to_project.html +++ b/api/write_text_file_to_project.html @@ -19,7 +19,7 @@ - + diff --git a/api2/directory-listing.html b/api2/directory-listing.html index 16c1e0a7..17f6a91f 100644 --- a/api2/directory-listing.html +++ b/api2/directory-listing.html @@ -19,7 +19,7 @@ - + diff --git a/api2/email-address-from-account-id.html b/api2/email-address-from-account-id.html index b8d795d2..ba874cd6 100644 --- a/api2/email-address-from-account-id.html +++ b/api2/email-address-from-account-id.html @@ -19,7 +19,7 @@ - + diff --git a/api2/get-purchases.html b/api2/get-purchases.html index 11ad3b0a..91cc8f6a 100644 --- a/api2/get-purchases.html +++ b/api2/get-purchases.html @@ -19,7 +19,7 @@ - + diff --git a/api2/index.html b/api2/index.html index 93c06f39..c14cd75e 100644 --- a/api2/index.html +++ b/api2/index.html @@ -19,7 +19,7 @@ - + diff --git a/api2/latex.html b/api2/latex.html index 5e7bd294..25077952 100644 --- a/api2/latex.html +++ b/api2/latex.html @@ -19,7 +19,7 @@ - + diff --git a/api2/purchasing-licenses.html b/api2/purchasing-licenses.html index a758482f..ff01c3c3 100644 --- a/api2/purchasing-licenses.html +++ b/api2/purchasing-licenses.html @@ -19,7 +19,7 @@ - + diff --git a/api2/stop.html b/api2/stop.html index eed63d90..fc1e16cf 100644 --- a/api2/stop.html +++ b/api2/stop.html @@ -19,7 +19,7 @@ - + diff --git a/api2/user-query.html b/api2/user-query.html index 52bcdfec..1e0e8159 100644 --- a/api2/user-query.html +++ b/api2/user-query.html @@ -19,7 +19,7 @@ - + diff --git a/apikeys.html b/apikeys.html index 3f876606..710f2c13 100644 --- a/apikeys.html +++ b/apikeys.html @@ -19,7 +19,7 @@ - + diff --git a/backups.html b/backups.html index dfcff6cc..ff04c2dc 100644 --- a/backups.html +++ b/backups.html @@ -19,7 +19,7 @@ - + diff --git a/billing.html b/billing.html index 25b38baf..2608ad8d 100644 --- a/billing.html +++ b/billing.html @@ -19,7 +19,7 @@ - + diff --git a/chat.html b/chat.html index 62a0b34f..d0ba720a 100644 --- a/chat.html +++ b/chat.html @@ -19,7 +19,7 @@ - + diff --git a/chatgpt.html b/chatgpt.html index 8cd7b0ab..ab6805b8 100644 --- a/chatgpt.html +++ b/chatgpt.html @@ -19,7 +19,7 @@ - + diff --git a/cocalc-cloud.html b/cocalc-cloud.html index 989fae86..3b8e107f 100644 --- a/cocalc-cloud.html +++ b/cocalc-cloud.html @@ -19,7 +19,7 @@ - + diff --git a/cocalc-desktop.html b/cocalc-desktop.html index 0bfbc2ea..d2c99fc0 100644 --- a/cocalc-desktop.html +++ b/cocalc-desktop.html @@ -19,7 +19,7 @@ - + diff --git a/compute_server.html b/compute_server.html index 615cbbf0..87643047 100644 --- a/compute_server.html +++ b/compute_server.html @@ -19,7 +19,7 @@ - + @@ -74,6 +74,16 @@
  • Becoming root and Port Forwarding
  • Billing for a Compute Server
  • Compute Server Filesystem
  • +
  • Choosing a Cloud +
  • Teaching with Compute Servers
  • @@ -130,19 +140,30 @@

    Compute Servers

    -

    CoCalc’s Most Unique Offering

    +

    CoCalc’s Most Unique Offering

    A compute server in CoCalc brings you closer to your dreams using an extremely powerful and flexible combination of

    -

    Examples of Compute Server Uses

    +

    Examples of Compute Server Uses

    You may find something useful, at least some inspiration, in our growing collection of tutorials that showcase compute servers. You can simply read them or follow along in video format. Here CoCalc’s CEO and Founder William Stein explains how to run the Google Colab environment on compute servers and use either Tensorflow or PyTorch:


    -

    Do I Still Need a License?

    +

    Do I Still Need a License?

    That is a great question! We do not force our users to get a regular license for working with compute servers, but since the CoCalc project is still used for file syncing and tracking compute server status, you will have smoother experience if your project has member hosting and sufficient RAM. In most cases the basic license with 2 GB RAM, 1 vCPU core, and 3 GB disk will work great!

    -

    Creating a Compute Server

    +

    Creating a Compute Server

    There are multiple ways to create a compute server, one of them is to click the Server button:

    -
    +
    Creating a Compute Server
    -

    Creating a Compute Server

    +

    Creating a Compute Server

    -

    The first settings allow you to give your server a name, pick a colour to easily distinguish where your are working, and choose the cloud provider used for your server:

    -
    +

    The first settings allow you to give your server a name, pick a colour to easily distinguish where your are working, and choose the cloud provider used for your server:

    +
    Creating a Compute Server
    -

    Creating a Compute Server

    +

    Creating a Compute Server

    -

    Using a Compute Server

    +

    Using a Compute Server

    Your freshly created compute server does not replace your CoCalc project, but rather complements it. This is why you have to explicitly indicate that you want to run your terminal or Jupyter notebook on a particular compute server, and you can have multiple compute servers running at the same time!

    Hint

    You can get close to a feeling of working “just on a compute server” if you switch to it in the file Explorer - you will be able to see its local files and all files that you open will run on the same compute server by default. See Compute Server Filesystem below.

    To run a Jupyter notebook on a compute server, click the Server button and select the one you want to use:

    -
    +
    Connecting a Compute Server to a Notebook
    -

    Connecting a Compute Server to a Notebook

    +

    Connecting a Compute Server to a Notebook

    You will get a confirmation dialog, reminding you that the current kernel will be stopped and a new one will have to be started on the compute server:

    -
    +
    Confirming the Choice of a Compute Server
    -

    Confirming the Choice of a Compute Server

    +

    Confirming the Choice of a Compute Server

    It is possible that the type of kernel used in your notebook is not available on the compute server (and vice versa). In this case you will need to choose another one:

    -
    +
    Picking a Kernel on a Compute Server
    -

    Picking a Kernel on a Compute Server

    +

    Picking a Kernel on a Compute Server

    The server bar appearing above the notebook allows you to quickly see where the notebook is running and shows the name you have given to this server, its unique ID, and the image used. Click on this bar to see more details about the server:

    -
    +
    Compute Server Status
    -

    Compute Server Status

    +

    Compute Server Status

    In order to use the Linux command line, e.g., compilers, etc., create a terminal file (one ending in .term) and connect it to a compute server in the same way. If you chose the “CUDA Toolkit” image, then the nvcc command will be available for compiling .cu code. See this tutorial for details.

    -

    Becoming root and Port Forwarding

    +

    Becoming root and Port Forwarding

    You cannot become root or use sudo inside of a CoCalc project. If you try to, you will get a message like

    -
    +
    Error Message Using sudo
    -

    Error Message Using sudo

    +

    Error Message Using sudo

    On a compute server it is fully possible, just make sure that your terminal is running on a compute server as explained above:

    -
    +
    Using sudo on a Compute Server
    -

    Using sudo on a Compute Server

    +

    Using sudo on a Compute Server

    When you become root as above, you are still inside of a Docker container that is closely integrated with CoCalc. If this creates problems for your use case, you can escape from it and become root on the actual virtual machine that represents your compute server. To do this, add SSH keys to your account (or project). Then use SSH to connect as root to localhost:

    -
    +
    Escape from the Compute Server Container
    -

    Escape from the Compute Server Container

    +

    Escape from the Compute Server Container

    Alternatively, you can use the external IP address of your compute server to connect to it from any other machine, bypassing CoCalc. This address is on the top of information about the server:

    -
    +
    Compute Server IP Address
    -

    Compute Server IP Address

    +

    Compute Server IP Address

    The same address can be used to gain access to services. If any software on your compute server instructs you to “go to http://localhost:8123”, execute

    @@ -318,7 +339,7 @@

    Becoming root and Po

    on your local computer and go to http://localhost:8123 in your local browser.

    -

    Billing for a Compute Server

    +

    Billing for a Compute Server

    A compute server is billed by the second and the price depends on its state:

    -

    Compute Server Filesystem

    +

    Compute Server Filesystem

    In order to smoothly and successfully use a compute server, it is essential to understand how its filesystem interacts with your CoCalc project.

    For the most part, all files in your CoCalc project conveniently appear in your home folder on the compute server and you can use them in a regular way. File changes inside of your CoCalc project and on your compute server can be synced both ways. This works great for Jupyter notebooks, for example. However, this convenience is still bound by laws of physics and because of network transfers involved it is much slower than modern local disks. You are also limited by your CoCalc disk quota.

    If you need to read or write massive amounts of data, e.g. for data science or machine learning, or the programs you are running operate with a lot of files, e.g. git status with a large repository, you do need to use local fast directories on your compute server. These directories are configured in the compute server settings when you create or edit one:

    -
    +
    Fast Data Directories
    -

    Fast Data Directories

    +

    Fast Data Directories

    As intended, these directories are NOT visible in your CoCalc project:

    -
    +
    File Explorer on Project
    -

    File Explorer on Project

    +

    File Explorer on Project

    In order to see them, to open files in them, or to open even synced files on the compute server without extra steps, connect your file explorer to the compute server in the same way as with notebooks and terminals, using the Server button. Now the fast data directories are visible (you can certainly have more than one):

    -
    +
    File Explorer on Compute Server
    -

    File Explorer on Compute Server

    +

    File Explorer on Compute Server

    When you edit files via CoCalc graphical interface, they are usually synced between the project and the compute server automatically. However, if you are using vim or some other tool in a terminal, or just want the files to be synced immediately, you may need to click the Sync Files button:

    -
    +
    Sync Files Button for a Compute Server
    -

    Sync Files Button for a Compute Server

    +

    Sync Files Button for a Compute Server

    +
    +

    Choosing a Cloud

    +

    It is impossible to choose “the best cloud” for compute servers overall, that is why CoCalc integrates with many of them! For each particular use case one may be more or less preferable - sometimes it may be obvious, sometimes it requires experimentation, and sometimes the difference is inconsequential. The purpose of this section is to highlight some points to consider when choosing a cloud, hopefully it will make this task easier for you.

    +
    +

    Cost

    +

    This may be the most obvious criterion, but while we strive to be as transparent as possible with the cost of running a compute server, do keep in mind also that:

    +
      +
    • there is a cost for the disk space when the server is off;

    • +
    • there may be some charge for network traffic, typically it is small compared to compute resources, but it does depend on your use case;

    • +
    • it may be more cost effective to use a configuration that is more expensive per hour if it allows you to complete your computations faster, thus paying for fewer hours.

    • +
    +
    +
    +

    Availability

    +

    This one may be less obvious than the cost, but it is even more important - the price of a computer server does not matter if you cannot start it! In most cases once you managed to start a compute server, you can continue using it until you explicitly turn it off. However, there is no guarantee that you will be able to start the same machine again in a few days - other users may utilize all resources.

    +
    +
    +

    Geographic location

    +

    Your organization may have particular restrictions on where your data are located. If you expect a lot of network traffic, it may be beneficial to choose a data centre close to your users. For interactive work you may want to start a compute server close to you to reduce latency.

    +
    +
    +

    Special Considerations

    +

    You may want to use a data centre satisfying particular requirements on sustainability, security, etc. We try to expose as much information about our cloud providers as possible to help our users to make an informed choice.

    +

    Let’s take a look now at some of the unique benefits of our cloud providers!

    +
    +
    +

    Google

    +
      +
    • Vast selection of varied configurations!

    • +
    • For computationally intensive tasks, do take a look at higher end machines. We had customers with very strict requirements on interconnect network between cluster nodes, but it turned out that Google had single nodes with enough vCPUs, eliminating the need for a cluster setup!

    • +
    • Spot instances offer up to 10x lower prices, if your work can deal with potential interruptions!

    • +
    +
    +
    +

    Hyperstack

    +
      +
    • Apart from cost and speed, Hyperstack prioritizes sustainability of their data centres. They are 100% powered by hydro-electricity and are located in Canada and Norway to benefit from lower ambient temperature for air cooling.

    • +
    • You can see how many GPUs are available on Hyperstack at any given time and estimate your chances of being able to get what you need in the future.

    • +
    +
    +
    +

    On Prem

    +
      +
    • You are in full control of the machine you are using.

    • +
    • At the moment On Prem compute servers are free, the intended cost when their development is finished is about 1/3 of a similar spot instance on Google. If you already own sufficient compute resources, this may be the most cost-effective option to benefit from the cloud and collaboration as well!

    • +
    +
    +
    -

    Teaching with Compute Servers

    +

    Teaching with Compute Servers

    Compute servers are a great option to let your students or workshop participants use GPUs or powerful compute resources! Some important points to consider ahead of the course start:

    diff --git a/share.html b/share.html index 8f794357..6637a40a 100644 --- a/share.html +++ b/share.html @@ -19,7 +19,7 @@ - + diff --git a/sitemap.xml b/sitemap.xml index 62928a00..96b04b0d 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,2 +1,2 @@ -https://doc.cocalc.com/en/account-dropdown.htmlhttps://doc.cocalc.com/en/account-toolbar.htmlhttps://doc.cocalc.com/en/account/licenses.htmlhttps://doc.cocalc.com/en/account/preferences.htmlhttps://doc.cocalc.com/en/account/public-files.htmlhttps://doc.cocalc.com/en/account/purchases.htmlhttps://doc.cocalc.com/en/account/ssh.htmlhttps://doc.cocalc.com/en/account/support.htmlhttps://doc.cocalc.com/en/activity-bar.htmlhttps://doc.cocalc.com/en/ai.htmlhttps://doc.cocalc.com/en/api-examples.htmlhttps://doc.cocalc.com/en/api/add_collaborator.htmlhttps://doc.cocalc.com/en/api/add_license_to_project.htmlhttps://doc.cocalc.com/en/api/change_email_address.htmlhttps://doc.cocalc.com/en/api/change_password.htmlhttps://doc.cocalc.com/en/api/copy_path_between_projects.htmlhttps://doc.cocalc.com/en/api/copy_path_delete.htmlhttps://doc.cocalc.com/en/api/copy_path_status.htmlhttps://doc.cocalc.com/en/api/copy_public_path_between_projects.htmlhttps://doc.cocalc.com/en/api/create_account.htmlhttps://doc.cocalc.com/en/api/create_project.htmlhttps://doc.cocalc.com/en/api/create_support_ticket.htmlhttps://doc.cocalc.com/en/api/delete_account.htmlhttps://doc.cocalc.com/en/api/disconnect_from_project.htmlhttps://doc.cocalc.com/en/api/forgot_password.htmlhttps://doc.cocalc.com/en/api/get_available_upgrades.htmlhttps://doc.cocalc.com/en/api/get_support_tickets.htmlhttps://doc.cocalc.com/en/api/get_usernames.htmlhttps://doc.cocalc.com/en/api/index.htmlhttps://doc.cocalc.com/en/api/index0.htmlhttps://doc.cocalc.com/en/api/invite_collaborator.htmlhttps://doc.cocalc.com/en/api/invite_noncloud_collaborators.htmlhttps://doc.cocalc.com/en/api/log_client_error.htmlhttps://doc.cocalc.com/en/api/metrics.htmlhttps://doc.cocalc.com/en/api/ping.htmlhttps://doc.cocalc.com/en/api/project_exec.htmlhttps://doc.cocalc.com/en/api/public_get_text_file.htmlhttps://doc.cocalc.com/en/api/query.htmlhttps://doc.cocalc.com/en/api/read_text_file_from_project.htmlhttps://doc.cocalc.com/en/api/remove_collaborator.htmlhttps://doc.cocalc.com/en/api/remove_license_from_project.htmlhttps://doc.cocalc.com/en/api/reset_forgot_password.htmlhttps://doc.cocalc.com/en/api/start_metrics.htmlhttps://doc.cocalc.com/en/api/touch_project.htmlhttps://doc.cocalc.com/en/api/unlink_passport.htmlhttps://doc.cocalc.com/en/api/user_auth.htmlhttps://doc.cocalc.com/en/api/user_search.htmlhttps://doc.cocalc.com/en/api/write_text_file_to_project.htmlhttps://doc.cocalc.com/en/api2/directory-listing.htmlhttps://doc.cocalc.com/en/api2/email-address-from-account-id.htmlhttps://doc.cocalc.com/en/api2/get-purchases.htmlhttps://doc.cocalc.com/en/api2/index.htmlhttps://doc.cocalc.com/en/api2/latex.htmlhttps://doc.cocalc.com/en/api2/purchasing-licenses.htmlhttps://doc.cocalc.com/en/api2/stop.htmlhttps://doc.cocalc.com/en/api2/user-query.htmlhttps://doc.cocalc.com/en/apikeys.htmlhttps://doc.cocalc.com/en/backups.htmlhttps://doc.cocalc.com/en/billing.htmlhttps://doc.cocalc.com/en/chat.htmlhttps://doc.cocalc.com/en/chatgpt.htmlhttps://doc.cocalc.com/en/cocalc-cloud.htmlhttps://doc.cocalc.com/en/cocalc-desktop.htmlhttps://doc.cocalc.com/en/compute_server.htmlhttps://doc.cocalc.com/en/contents.htmlhttps://doc.cocalc.com/en/csv-viewer.htmlhttps://doc.cocalc.com/en/display-options.htmlhttps://doc.cocalc.com/en/explorer.htmlhttps://doc.cocalc.com/en/files-search.htmlhttps://doc.cocalc.com/en/flyouts.htmlhttps://doc.cocalc.com/en/frame-editor.htmlhttps://doc.cocalc.com/en/genindex.htmlhttps://doc.cocalc.com/en/getting-started.htmlhttps://doc.cocalc.com/en/howto/activeloop-hub.htmlhttps://doc.cocalc.com/en/howto/assembly-language.htmlhttps://doc.cocalc.com/en/howto/awscli.htmlhttps://doc.cocalc.com/en/howto/bash-fortunes.htmlhttps://doc.cocalc.com/en/howto/bokeh-server.htmlhttps://doc.cocalc.com/en/howto/cant-save.htmlhttps://doc.cocalc.com/en/howto/clock-is-off.htmlhttps://doc.cocalc.com/en/howto/connectivity-issues.htmlhttps://doc.cocalc.com/en/howto/convert-html-to-pdf.htmlhttps://doc.cocalc.com/en/howto/cplusplus.htmlhttps://doc.cocalc.com/en/howto/custom-jupyter-kernel.htmlhttps://doc.cocalc.com/en/howto/dask.htmlhttps://doc.cocalc.com/en/howto/disk-space-warning.htmlhttps://doc.cocalc.com/en/howto/export-timetravel.htmlhttps://doc.cocalc.com/en/howto/external-tools.htmlhttps://doc.cocalc.com/en/howto/file-too-large.htmlhttps://doc.cocalc.com/en/howto/firewall-info.htmlhttps://doc.cocalc.com/en/howto/fix-broken-jupyter-pdf.htmlhttps://doc.cocalc.com/en/howto/fortran.htmlhttps://doc.cocalc.com/en/howto/front-end-dev.htmlhttps://doc.cocalc.com/en/howto/gap-kernel-unavailable.htmlhttps://doc.cocalc.com/en/howto/git.htmlhttps://doc.cocalc.com/en/howto/google-api.htmlhttps://doc.cocalc.com/en/howto/gsl.htmlhttps://doc.cocalc.com/en/howto/index.htmlhttps://doc.cocalc.com/en/howto/install-julia-package.htmlhttps://doc.cocalc.com/en/howto/install-python-lib.htmlhttps://doc.cocalc.com/en/howto/install-r-package.htmlhttps://doc.cocalc.com/en/howto/jupyter-extension.htmlhttps://doc.cocalc.com/en/howto/jupyter-kernel-selection.htmlhttps://doc.cocalc.com/en/howto/jupyter-kernel-terminated.htmlhttps://doc.cocalc.com/en/howto/jupyter-plot-png-svg.htmlhttps://doc.cocalc.com/en/howto/jupyterlab-extensions.htmlhttps://doc.cocalc.com/en/howto/license-doesnt-work.htmlhttps://doc.cocalc.com/en/howto/low-memory.htmlhttps://doc.cocalc.com/en/howto/missing-project.htmlhttps://doc.cocalc.com/en/howto/mongodb.htmlhttps://doc.cocalc.com/en/howto/multiple-accounts.htmlhttps://doc.cocalc.com/en/howto/nbgrader.htmlhttps://doc.cocalc.com/en/howto/neuron.htmlhttps://doc.cocalc.com/en/howto/octave.htmlhttps://doc.cocalc.com/en/howto/orphan.htmlhttps://doc.cocalc.com/en/howto/overleaf.htmlhttps://doc.cocalc.com/en/howto/parallel.htmlhttps://doc.cocalc.com/en/howto/plotly-dash.htmlhttps://doc.cocalc.com/en/howto/pluto.htmlhttps://doc.cocalc.com/en/howto/postgresql.htmlhttps://doc.cocalc.com/en/howto/project-invitation-tokens.htmlhttps://doc.cocalc.com/en/howto/recover-deleted-file.htmlhttps://doc.cocalc.com/en/howto/remarkjs-slideshow.htmlhttps://doc.cocalc.com/en/howto/ruby.htmlhttps://doc.cocalc.com/en/howto/run-r-step-by-step.htmlhttps://doc.cocalc.com/en/howto/running-processes.htmlhttps://doc.cocalc.com/en/howto/sage-question.htmlhttps://doc.cocalc.com/en/howto/shiny-server.htmlhttps://doc.cocalc.com/en/howto/slow-worksheet.htmlhttps://doc.cocalc.com/en/howto/software-development.htmlhttps://doc.cocalc.com/en/howto/streamlit.htmlhttps://doc.cocalc.com/en/howto/sudo-make-install.htmlhttps://doc.cocalc.com/en/howto/trouble.htmlhttps://doc.cocalc.com/en/howto/turtle.htmlhttps://doc.cocalc.com/en/howto/upload.htmlhttps://doc.cocalc.com/en/howto/webserver.htmlhttps://doc.cocalc.com/en/index.htmlhttps://doc.cocalc.com/en/introduction.htmlhttps://doc.cocalc.com/en/ipad.htmlhttps://doc.cocalc.com/en/jupyter.htmlhttps://doc.cocalc.com/en/jupyter-classical-vs-cocalc.htmlhttps://doc.cocalc.com/en/jupyter-enhancements.htmlhttps://doc.cocalc.com/en/jupyter-start.htmlhttps://doc.cocalc.com/en/jupyter-tips-and-tricks.htmlhttps://doc.cocalc.com/en/latex.htmlhttps://doc.cocalc.com/en/latex-faq.htmlhttps://doc.cocalc.com/en/latex-features.htmlhttps://doc.cocalc.com/en/latex-start.htmlhttps://doc.cocalc.com/en/licenses.htmlhttps://doc.cocalc.com/en/markdown.htmlhttps://doc.cocalc.com/en/news.htmlhttps://doc.cocalc.com/en/news/ubuntu-2004.htmlhttps://doc.cocalc.com/en/on-premises.htmlhttps://doc.cocalc.com/en/paygo.htmlhttps://doc.cocalc.com/en/platform.htmlhttps://doc.cocalc.com/en/platform-news.htmlhttps://doc.cocalc.com/en/plus-new.htmlhttps://doc.cocalc.com/en/processes.htmlhttps://doc.cocalc.com/en/project.htmlhttps://doc.cocalc.com/en/project-faq.htmlhttps://doc.cocalc.com/en/project-files.htmlhttps://doc.cocalc.com/en/project-home.htmlhttps://doc.cocalc.com/en/project-init.htmlhttps://doc.cocalc.com/en/project-library.htmlhttps://doc.cocalc.com/en/project-list.htmlhttps://doc.cocalc.com/en/project-log.htmlhttps://doc.cocalc.com/en/project-settings.htmlhttps://doc.cocalc.com/en/project-toolbar.htmlhttps://doc.cocalc.com/en/references.htmlhttps://doc.cocalc.com/en/restrict-student-projects.htmlhttps://doc.cocalc.com/en/rich-text.htmlhttps://doc.cocalc.com/en/sagews.htmlhttps://doc.cocalc.com/en/servers.htmlhttps://doc.cocalc.com/en/service_options.htmlhttps://doc.cocalc.com/en/share.htmlhttps://doc.cocalc.com/en/slides.htmlhttps://doc.cocalc.com/en/snippets.htmlhttps://doc.cocalc.com/en/software.htmlhttps://doc.cocalc.com/en/software/custom_software.htmlhttps://doc.cocalc.com/en/software/custom_software0.htmlhttps://doc.cocalc.com/en/software/updates-2018.htmlhttps://doc.cocalc.com/en/software/updates-2019.htmlhttps://doc.cocalc.com/en/software/updates-2020.htmlhttps://doc.cocalc.com/en/software/updates-2021.htmlhttps://doc.cocalc.com/en/software/updates-2022.htmlhttps://doc.cocalc.com/en/software/updates-2023.htmlhttps://doc.cocalc.com/en/software/updates-2024.htmlhttps://doc.cocalc.com/en/tasks.htmlhttps://doc.cocalc.com/en/teaching-after-course.htmlhttps://doc.cocalc.com/en/teaching-course-management.htmlhttps://doc.cocalc.com/en/teaching-create-course.htmlhttps://doc.cocalc.com/en/teaching-instructors.htmlhttps://doc.cocalc.com/en/teaching-interactions.htmlhttps://doc.cocalc.com/en/teaching-nbgrader.htmlhttps://doc.cocalc.com/en/teaching-students.htmlhttps://doc.cocalc.com/en/teaching-tips_and_tricks.htmlhttps://doc.cocalc.com/en/teaching-upgrade-course.htmlhttps://doc.cocalc.com/en/teaching-upgrade-legacy.htmlhttps://doc.cocalc.com/en/teaching-workshop.htmlhttps://doc.cocalc.com/en/terminal.htmlhttps://doc.cocalc.com/en/time-travel.htmlhttps://doc.cocalc.com/en/timers.htmlhttps://doc.cocalc.com/en/tours.htmlhttps://doc.cocalc.com/en/trial.htmlhttps://doc.cocalc.com/en/update-credit-card.htmlhttps://doc.cocalc.com/en/upgrade-guide.htmlhttps://doc.cocalc.com/en/upgrades.htmlhttps://doc.cocalc.com/en/user_interface.htmlhttps://doc.cocalc.com/en/users.htmlhttps://doc.cocalc.com/en/vouchers.htmlhttps://doc.cocalc.com/en/vscode.htmlhttps://doc.cocalc.com/en/whiteboard.htmlhttps://doc.cocalc.com/en/working_with.htmlhttps://doc.cocalc.com/en/x11.htmlhttps://doc.cocalc.com/en/genindex.htmlhttps://doc.cocalc.com/en/search.html \ No newline at end of file +https://doc.cocalc.com/en/compute_server.htmlhttps://doc.cocalc.com/en/contents.htmlhttps://doc.cocalc.com/en/service_options.htmlhttps://doc.cocalc.com/en/genindex.htmlhttps://doc.cocalc.com/en/search.html \ No newline at end of file diff --git a/slides.html b/slides.html index 13992ba7..8626e714 100644 --- a/slides.html +++ b/slides.html @@ -19,7 +19,7 @@ - + diff --git a/snippets.html b/snippets.html index 53ec6d9d..64ea69ab 100644 --- a/snippets.html +++ b/snippets.html @@ -19,7 +19,7 @@ - + diff --git a/software.html b/software.html index 83d56e0c..8a801dd8 100644 --- a/software.html +++ b/software.html @@ -19,7 +19,7 @@ - + diff --git a/software/custom_software.html b/software/custom_software.html index 5e2f5a72..b1cb0644 100644 --- a/software/custom_software.html +++ b/software/custom_software.html @@ -19,7 +19,7 @@ - + diff --git a/software/custom_software0.html b/software/custom_software0.html index 07f9c939..95b6dabf 100644 --- a/software/custom_software0.html +++ b/software/custom_software0.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2018.html b/software/updates-2018.html index 88a44e60..8d88783a 100644 --- a/software/updates-2018.html +++ b/software/updates-2018.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2019.html b/software/updates-2019.html index 0a62a989..f2dfa16e 100644 --- a/software/updates-2019.html +++ b/software/updates-2019.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2020.html b/software/updates-2020.html index 12400f1c..334da793 100644 --- a/software/updates-2020.html +++ b/software/updates-2020.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2021.html b/software/updates-2021.html index 417e031b..576e71a3 100644 --- a/software/updates-2021.html +++ b/software/updates-2021.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2022.html b/software/updates-2022.html index d1ba9fe1..23f08e04 100644 --- a/software/updates-2022.html +++ b/software/updates-2022.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2023.html b/software/updates-2023.html index f33f96d1..0d98f2e8 100644 --- a/software/updates-2023.html +++ b/software/updates-2023.html @@ -19,7 +19,7 @@ - + diff --git a/software/updates-2024.html b/software/updates-2024.html index 0d44a2e7..afa7b592 100644 --- a/software/updates-2024.html +++ b/software/updates-2024.html @@ -19,7 +19,7 @@ - + diff --git a/tasks.html b/tasks.html index eed3ad72..74139260 100644 --- a/tasks.html +++ b/tasks.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-after-course.html b/teaching-after-course.html index 8641ff24..e357ed33 100644 --- a/teaching-after-course.html +++ b/teaching-after-course.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-course-management.html b/teaching-course-management.html index 4b847db2..3b569f45 100644 --- a/teaching-course-management.html +++ b/teaching-course-management.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-create-course.html b/teaching-create-course.html index b0bc249e..10759630 100644 --- a/teaching-create-course.html +++ b/teaching-create-course.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-instructors.html b/teaching-instructors.html index 6dfd69c1..d4695cdd 100644 --- a/teaching-instructors.html +++ b/teaching-instructors.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-interactions.html b/teaching-interactions.html index 9a374ed5..952ebef7 100644 --- a/teaching-interactions.html +++ b/teaching-interactions.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-nbgrader.html b/teaching-nbgrader.html index c5b808ee..4280c95b 100644 --- a/teaching-nbgrader.html +++ b/teaching-nbgrader.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-students.html b/teaching-students.html index e9ffca8b..abfe3828 100644 --- a/teaching-students.html +++ b/teaching-students.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-tips_and_tricks.html b/teaching-tips_and_tricks.html index a298ee01..0874e00e 100644 --- a/teaching-tips_and_tricks.html +++ b/teaching-tips_and_tricks.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-upgrade-course.html b/teaching-upgrade-course.html index cc7783c5..2aa9fd80 100644 --- a/teaching-upgrade-course.html +++ b/teaching-upgrade-course.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-upgrade-legacy.html b/teaching-upgrade-legacy.html index d582f1d9..0c108941 100644 --- a/teaching-upgrade-legacy.html +++ b/teaching-upgrade-legacy.html @@ -19,7 +19,7 @@ - + diff --git a/teaching-workshop.html b/teaching-workshop.html index 21437c2e..4cbe8c74 100644 --- a/teaching-workshop.html +++ b/teaching-workshop.html @@ -19,7 +19,7 @@ - + diff --git a/terminal.html b/terminal.html index 81a16ee3..9e13e3d6 100644 --- a/terminal.html +++ b/terminal.html @@ -19,7 +19,7 @@ - + diff --git a/time-travel.html b/time-travel.html index baa0b351..01eeba72 100644 --- a/time-travel.html +++ b/time-travel.html @@ -19,7 +19,7 @@ - + diff --git a/timers.html b/timers.html index c57c077d..5701a297 100644 --- a/timers.html +++ b/timers.html @@ -19,7 +19,7 @@ - + diff --git a/tours.html b/tours.html index 497e9d90..05976e84 100644 --- a/tours.html +++ b/tours.html @@ -19,7 +19,7 @@ - + diff --git a/trial.html b/trial.html index 23a316e4..bc3d223a 100644 --- a/trial.html +++ b/trial.html @@ -19,7 +19,7 @@ - + diff --git a/update-credit-card.html b/update-credit-card.html index f1b21e25..499ec761 100644 --- a/update-credit-card.html +++ b/update-credit-card.html @@ -19,7 +19,7 @@ - + diff --git a/upgrade-guide.html b/upgrade-guide.html index a59cd094..3b33d9d9 100644 --- a/upgrade-guide.html +++ b/upgrade-guide.html @@ -19,7 +19,7 @@ - + diff --git a/upgrades.html b/upgrades.html index 03e41729..549a22fe 100644 --- a/upgrades.html +++ b/upgrades.html @@ -19,7 +19,7 @@ - + diff --git a/user_interface.html b/user_interface.html index 620f39a4..6778730a 100644 --- a/user_interface.html +++ b/user_interface.html @@ -19,7 +19,7 @@ - + diff --git a/users.html b/users.html index 3d6ede12..17ec1910 100644 --- a/users.html +++ b/users.html @@ -19,7 +19,7 @@ - + diff --git a/vouchers.html b/vouchers.html index 244e0485..585bfa6f 100644 --- a/vouchers.html +++ b/vouchers.html @@ -19,7 +19,7 @@ - + diff --git a/vscode.html b/vscode.html index c32bb38d..c085aca4 100644 --- a/vscode.html +++ b/vscode.html @@ -19,7 +19,7 @@ - + diff --git a/whiteboard.html b/whiteboard.html index 0c51a4e6..07e333cf 100644 --- a/whiteboard.html +++ b/whiteboard.html @@ -19,7 +19,7 @@ - + diff --git a/working_with.html b/working_with.html index c4811e5b..7c6e7de6 100644 --- a/working_with.html +++ b/working_with.html @@ -19,7 +19,7 @@ - + diff --git a/x11.html b/x11.html index 4f00ea83..425fcf5d 100644 --- a/x11.html +++ b/x11.html @@ -19,7 +19,7 @@ - +