berkeley-dsep-infra / datahub

JupyterHubs for use by Berkeley enrolled students
https://docs.datahub.berkeley.edu
BSD 3-Clause "New" or "Revised" License
67 stars 39 forks source link

Additional packages for module 1 ESPM-157 #5827

Open cboettig opened 5 months ago

cboettig commented 5 months ago

Package Name

altair, ibis-framework[duckdb], leafmap[libremap], myst

Hub URL

nature.datahub.berkeley.edu

Course Name

ESPM 157

Semester Details

Fall 2024

Installation Deadline

Start of Semester.

Let me know if it would be better to do separate requests? Also, I know most of these we can install ourselves but it looks like myst will require a working nodejs setup.

balajialg commented 4 months ago

@cboettig Added all the requested packages in https://staging.datahub.berkeley.edu/ via this PR1 & PR2. I currently tested this notebook from ESPM 157 Github repo. It seems like ibis-framework[pandas] is the package required to get the notebook to execute successfully. Do you also need the ibis-framework package which has a large scope in addition to ibis-framework[pandas] - https://ibis-project.org/install

With ibis-framework & without ibis-framework[pandas], I get the following error. Screenshot 2024-07-25 at 1 16 27 PM

balajialg commented 4 months ago

Closing this issue as changes got merged to prod. @cboettig Please reopen this issue if that is not the case.

cboettig commented 3 months ago

@balajialg thanks much! Apologies I'm looping back here and catching up. Yes, can we have both pandas and duckdb backends for ibis? ibis-framework[pandas,duckdb] . (We may be able to stick with pure duckdb if https://github.com/duckdb/duckdb/issues/13121 is merged soon :grin: )

I don't think I have permissions re-open.

balajialg commented 3 months ago

@cboettig Sure, I am assuming that you would want https://pypi.org/project/jupyter-vscode-server/ extension. Any other code server extension that you want as part of the image?

For increasing RAM, we need the bcourses id for your FA 24 course. Can you either share the bcourses id here or create a separate request via this github issue. I will create a PR to address all the above requests.

cboettig commented 3 months ago

@balajialg Thanks much!! It looks like jupyter-vscode-server already installed on datahub.berkeley.edu. However, Code-server itself has it's own extension system, but it can't install:

image

for whatever reason, code-server also doesn't detect a python installation (probably something about how conda is configured?). It would be great if users could could go to e.g. https://datahub.berkeley.edu/user/cboettig/vscode/ (or appropriate link) and be able to start running in an ipynb notebook there.

balajialg commented 3 months ago

Thanks @cboettig, will look into it.

cboettig commented 3 months ago

@balajialg One more python module request for you. (Sorry, just finding so much awesome stuff in the python ecosystem while migrating from the R version of this course. I know we could do quarto but Myst is :heart_eyes_cat: )

balajialg commented 3 months ago

@cboettig No worries, keep it coming :P

ryanlovett commented 3 months ago

@cboettig Do you mean pre-install the Jupyter and Python extensions?

@balajialg I think this can be done by adding something like this to the docker image:

export VSCODE_EXTENSIONS=${CONDA_DIR}/share/code-server/extensions
code-server --extensions-dir ${VSCODE_EXTENSIONS} --install-extension ms-python.python --force
code-server --extensions-dir ${VSCODE_EXTENSIONS} --install-extension ms-toolsai.jupyter

To be reproducible, we'd need to first download specific versions and then install, e.g.

export VSCODE_EXTENSIONS=${CONDA_DIR}/share/code-server/extensions

VSIX=2024.13.2024080701
wget https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/${VSIX}/vspackage -O /tmp/ms-python.vsix
code-server --extensions-dir ${VSCODE_EXTENSIONS} --install-extension /tmp/ms-python.vsix 
balajialg commented 3 months ago

Thanks @ryanlovett! This is helpful instructions. I will get to this asap!

balajialg commented 3 months ago

@ryanlovett Just created a PR - https://github.com/berkeley-dsep-infra/datahub/pull/5915 which addresses Carl's requirement

balajialg commented 3 months ago

@cboettig Just wanted to give you a heads up about where things are currently - We are seeing 3 different challenges to get the extension set up working in VSCode as expected before the start of the instruction,

a) Downloading VSIX files for the required VSCode extensions via wget/curl is failing since there is a discrepancy in the size of the VSIX files when downloaded via GUI vs CLI. We might need to download it via UI, place it in datahub directory and reference it in the docker image. Ref: https://github.com/microsoft/vscode-python/issues/17491 b) Ensuring that a single Python kernel is selected in the VSCode interface amongst multiple kernels requires 3rd party extensions which are not available in the code-server aka open-source version of VSCode. Ref: https://coder.com/docs/code-server/FAQ#how-does-the-config-file-work. We are looking at other options to circumvent this. c) Hiding other kernels so that a default kernel is selected needs to be done on a per-user/workspace basis and from the limited information we have currently, it might be hard to change default settings. Ref: https://github.com/microsoft/vscode-jupyter/discussions/13032#discussioncomment-8049433

Jonathan, Ryan and I met yesterday for a debugging session to get this to work (Jonathan and I had a marathon meeting lasting 3+ hours). We will be meeting again next week to hash out the next steps.

Being transparent - If we cannot get it to work the way you wanted during the next meeting, we might need to postpone handling this request by a month or so since the semester's start is a really hectic time to deep dive into a single issue.

cboettig commented 3 months ago

ok thanks for the heads up. I think we'll try and stick with pure jupyterhub interface then

cboettig commented 3 months ago

@balajialg @ryanlovett

Hopefully quick/small thing here. I'd like students to be able to delete folders/directories even if they aren't empty. (I find most GUIs allow this, and not being able to delete non-empty dirs confuses students.) I gather it's possible but couldn't figure out the configuration option (see https://discourse.jupyter.org/t/recursive-delete-directories-in-file-browser/27468/2) any ideas? Is this something we could enable out of the box?

(I know this is potentially destructive, but I really emphasize that students should treat hub storage as ephemeral anyway and want them to be good stewards of that space cleaning up storage without teaching bash commands)

felder commented 3 months ago

@cboettig one concern that'd I'd have is we're currently talking about the datahub hub, so a config change for one class will impact all others on the same hub. I wholeheartedly support the idea of being a good steward of resources and informing students to consider hub storage as ephemeral including encouraging folks do their own backups. I wish more people did this!

However, as you've indicated this is potentially destructive and represents a departure from how non empty directories are currently treated. It could present a problem for other courses where less focus is spent talking about resource management. What I'd love to see here is an upstream change where a recursive delete requires a confirmation perhaps even with a checkbox to acknowledge when one is deleting a non empty directory. That would allow for this functionality with less of a chance of a destructive mistake.

ryanlovett commented 3 months ago

I think it is possible to mount code containing a FileContentsManager.always_delete_dir setting to the jupyter config directory just for a specific course. While we do something like this in hub/values.yml:

singleuser:
  extraFiles:
    jupyter_server_config.json:
      mountPath: /usr/local/etc/jupyter/jupyter_server_config.json
      data:
        FileContentsManager:
          always_delete_dir: true

it would need to be ported to kubespawner override form in order to take effect for just the classes we want. I think it would need to be a volumeMount, e.g.

volumeMounts:
- name: home
  subPath: _espm-157/espm-157.json
  mountPath: /usr/local/etc/jupyter/jupyter_server_config.d/espm-157.json

where we put the config in the filestore in a course subdirectory. We do this for shared directories, but instead of sharing data, we'd "share" configuration. The contents of the file would be:

{"FileContentsManager":{"always_delete_dir":true}}

We may or may not need to precreate /usr/local/etc/jupyter/jupyter_server_config.d. (I don't know if kubernetes would make that for us when it performs the mount.)

See /srv/conda/etc/jupyter/jupyter_server_config.d for config files installed by packages.

Note that I'd rather that this config be code deployed from the repo rather than from a directory on the filestore. One way to do that would be to put the configuration data inside a configMap. There's no existing example of that, but it may not be too hard. The above should work though.

cboettig commented 3 months ago

@balajialg for some reason import seaborn seems broken for me on the hub? I get this trace:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[1], line 2
      1 import ibis
----> 2 import seaborn as sns

File /srv/conda/lib/python3.11/site-packages/seaborn/__init__.py:9
      7 from .categorical import *  # noqa: F401,F403
      8 from .distributions import *  # noqa: F401,F403
----> 9 from .matrix import *  # noqa: F401,F403
     10 from .miscplot import *  # noqa: F401,F403
     11 from .axisgrid import *  # noqa: F401,F403

File /srv/conda/lib/python3.11/site-packages/seaborn/matrix.py:12
      9 import pandas as pd
     10 from scipy.cluster import hierarchy
---> 12 from . import cm
     13 from .axisgrid import Grid
     14 from .utils import (
     15     despine,
     16     axis_ticklabels_overlap,
   (...)
     19     _draw_figure,
     20 )

File /srv/conda/lib/python3.11/site-packages/seaborn/cm.py:1582
   1579     _cmap_r = colors.ListedColormap(_lut[::-1], _name + "_r")  
   1580     locals()[_name + "_r"] = _cmap_r
-> 1582     mpl_cm.register_cmap(_name, _cmap)
   1583     mpl_cm.register_cmap(_name + "_r", _cmap_r)
   1585 del colors, mpl_cm

AttributeError: module 'matplotlib.cm' has no attribute 'register_cmap'

Also, lemme know if we might get Myst markdown back. Also let me know if you have a reproducible example of the issue, I saw the forum post you've linked and tried asking around a bit and only hear that myst should work well with LaTeX?

cboettig commented 3 months ago

(it looks like I can resolve the seaborn issue by upgrading via conda install seaborn, but would be much preferable to have seaborn working out of the box on day one of class next week... :worried:

felder commented 3 months ago

@cboettig currently seaborn is version locked on datahub:

datahub/images/default/environment.yml:27:- seaborn=0.11.*

When I look:

jovyan@jupyter-felder:~$ mamba list | grep -i seaborn

seaborn                   0.11.2               hd8ed1ab_0    conda-forge
seaborn-base              0.11.2             pyhd8ed1ab_0    conda-forge
jovyan@jupyter-felder:~$ mamba install seaborn

Looking for: ['seaborn']

conda-forge/noarch                                  16.1MB @  29.0MB/s  0.9s
conda-forge/linux-64                                37.1MB @  28.9MB/s  2.4s

Pinned packages:
  - python 3.11.*

Transaction

  Prefix: /srv/conda

  All requested packages already installed

jovyan@jupyter-felder:~$ mamba update seaborn

Looking for: ['seaborn']

conda-forge/linux-64                                        Using cache
conda-forge/noarch                                          Using cache

Pinned packages:
  - python 3.11.*

Transaction

  Prefix: /srv/conda

  Updating specs:

   - seaborn
   - ca-certificates
   - certifi
   - openssl

  Package         Version  Build         Channel          Size
────────────────────────────────────────────────────────────────
  Upgrade:
────────────────────────────────────────────────────────────────

  - seaborn-base   0.11.2  pyhd8ed1ab_0  conda-forge     229kB
  + seaborn-base   0.13.2  pyhd8ed1ab_2  conda-forge     235kB
  - seaborn        0.11.2  hd8ed1ab_0    conda-forge       4kB
  + seaborn        0.13.2  hd8ed1ab_2    conda-forge       7kB

  Summary:

  Upgrade: 2 packages

  Total download: 242kB

────────────────────────────────────────────────────────────────

Confirm changes: [Y/n] y
seaborn                                              7.0kB @  47.6kB/s  0.1s
seaborn-base                                       234.6kB @   1.4MB/s  0.2s

Downloading and Extracting Packages:

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
jovyan@jupyter-felder:~$ 

It is definitely not recommended to have students running conda to update packages manually as those updates will not persist between server launches. Can you please confirm that seaborn 0.13.2 meets your needs (or is the version that gets deployed when you run conda install). If so we can probably adjust the version lock for seaborn to deploy 0.13.2.

Also for the future, we version lock packages so that subsequent deployments during the semester will not result in unintended package changes which have a habit of breaking things. It's really helpful if when specifying packages you also specify versions.

felder commented 3 months ago

I was able to reproduce your issue in datahub prod using a newly created notebook that only includes:

import seaborn

After upgrading to 0.13.2 via mamba on my running pod, I can confirm the import statement does not error. I'll go ahead and do the version bump.

felder commented 3 months ago

@cboettig it'll be a while before this gets deployed. Once the above PR makes it to staging I'll test and assuming seaborn is fixed I'll submit another PR to merge and deploy this change to prod.

cboettig commented 3 months ago

Thanks @felder !

(yup, :100: on board with not having students conda install, and I like that it gets reset between server launches because that's a great way to get back to a working system if students do go about running conda install and getting things stuck. And I appreciate that seaborn is a widely used package on the hub and locked version for good reason. Thanks for confirming the current version is broken for more than just me :-) !)

balajialg commented 3 months ago

Thanks @felder for quickly handling the issue

Also, lemme know if we might get Myst markdown back. Also let me know if you have a reproducible example of the issue, I saw the forum post you've linked and tried asking around a bit and only hear that myst should work well with LaTeX?

@cboettig Here is a notebook shared by the instructor for example: 01_basics. You can see that the Latex output is not compiled in the markdown cell and as a result you can see output like - "Compute the remainder of "$\dfrac{27}{5}$" in Python". You can uninstall JupyterLab-myst package from pypi manager (after opening the notebook in a lab interface) and can observe that the latex output is rendering as expected.

If the instructor used data8.datahub, things render correctly. Here is the same notebook again that renders as expected in the data8 hub which doesn't have the myst package: 01_basics.

We will discuss this internally during a meeting and see if we can find a better approach to get you myst package.

cboettig commented 3 months ago

@balajialg ha, I see what you mean. Myst isn't breaking the LaTeX per se though, the issue is that Myst isn't parsing the MathJax (LaTeX) that it finds inside other HTML elements, like so:

<div class="alert alert-block alert-info"> Compute the remainder of  \dfrac{27}{5} in Python.</div>
cboettig commented 3 months ago

by the way, I believe the Myst way of creating "Admonitions" like the other instructor is using in markdown chunks is to do something like

:::{note}

 **TRY IT!** Compute the remainder of  $\dfrac{27}{5}$ in Python.

but I certainly appreciate they don't want to change scores of markdown cells in all their notebooks by hand right now!

felder commented 3 months ago

@cboettig change for seaborn is live on prod. Restart your server and please confirm.

cboettig commented 3 months ago

@felder :tada: seaborn works out of the box again. thanks!

balajialg commented 3 months ago

@cboettig Thanks, that is helpful! We just had a team meeting and discussed in detail the Myst issue. Few ideas got proposed during the meeting as next steps,

On another note, Eric and I will work with Mohammad to see if he can modify the notebooks to be compatible with myst. No guarantees here though.

ryanlovett commented 3 months ago

To follow up on what @balajialg said, we assume you'd prefer a rocker-based image for both python+r environments -- just let us know what the starting point should be, and what apps and libraries you need beyond the recent requests.

cboettig commented 3 months ago

Thanks team!

balajialg commented 3 months ago

Awesome, thanks @cboettig! nature.datahub.berkeley.edu sounds great. Few follow up questions,

cboettig commented 3 months ago

@balajialg thanks!

Basically everything I've hit so far is already solved except the myst-jupyterlab conflicts. btw myst devs suggested they could fix this upstream, though obviously may take a while yet.

balajialg commented 3 months ago

Thanks @cboettig, that's helpful info! We should target getting the hub ready before the week of Sep 16-20.

balajialg commented 3 months ago

@cboettig - @felder is starting to deploy the new nature hub in prep for your classes during week 4. It would be helpful to know the consolidated list of Python packages that are required for your course. I have listed some base Python packages + the list of packages you had requested historically. Can you please review the list below and let us know of any additions/deletions/edits? I copied the versions from the DataHub image but please specify if you have preference on the exact version for these packages. Appreciate your input!

- numpy=1.26.*
- matplotlib=3.9.*
- scipy=1.10.0
- ipympl=0.9.*
- pandas==2.2.2
- statsmodels=0.13.5
- scikit-learn=1.4.*
- seaborn=0.13.2
- decorator=5.0.*
- networkx=2.6.*
- spacy=3.7.3
- nltk=3.6.*
- ibis-framework[pandas,duckdb]==9.2.0
- jupyter-vscode-proxy==0.6
- code-server==4.23.1
- altair==5.3.0
- leafmap==0.36.4
- mystmd==1.3.1
- jupyterlab-git==0.50.1
felder commented 3 months ago

FYI here's a huge list of packages that are installed:

jovyan@fb175f20ed24:~/.cache$ mamba list
# packages in environment at /srv/conda/envs/notebook:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       2_gnu    conda-forge
aiofiles                  22.1.0             pyhd8ed1ab_0    conda-forge
aiohappyeyeballs          2.4.0              pyhd8ed1ab_0    conda-forge
aiohttp                   3.10.5          py311h61187de_0    conda-forge
aiosignal                 1.3.1              pyhd8ed1ab_0    conda-forge
aiosqlite                 0.19.0             pyhd8ed1ab_0    conda-forge
alembic                   1.12.0             pyhd8ed1ab_0    conda-forge
altair                    5.4.1              pyhd8ed1ab_0    conda-forge
annotated-types           0.7.0              pyhd8ed1ab_0    conda-forge
anyio                     3.7.1              pyhd8ed1ab_0    conda-forge
anywidget                 0.9.13             pyhd8ed1ab_0    conda-forge
appdirs                   1.4.4              pyh9f0ad1d_0    conda-forge
argon2-cffi               23.1.0             pyhd8ed1ab_0    conda-forge
argon2-cffi-bindings      21.2.0          py311h459d7ec_4    conda-forge
arrow                     1.3.0              pyhd8ed1ab_0    conda-forge
asgiref                   3.8.1              pyhd8ed1ab_0    conda-forge
asttokens                 2.4.0              pyhd8ed1ab_0    conda-forge
async-lru                 2.0.4              pyhd8ed1ab_0    conda-forge
async_generator           1.10                       py_0    conda-forge
atk-1.0                   2.38.0               h04ea711_2    conda-forge
atpublic                  3.1                pyhd8ed1ab_0    conda-forge
attrs                     23.1.0             pyh71513ae_1    conda-forge
aws-c-auth                0.7.26               hc36b679_2    conda-forge
aws-c-cal                 0.7.4                h2abdd08_0    conda-forge
aws-c-common              0.9.27               h4bc722e_0    conda-forge
aws-c-compression         0.2.19               haa50ccc_0    conda-forge
aws-c-event-stream        0.4.3                h570d160_0    conda-forge
aws-c-http                0.8.8                h9b61739_1    conda-forge
aws-c-io                  0.14.18              h49c7fd3_7    conda-forge
aws-c-mqtt                0.10.4              h5c8269d_18    conda-forge
aws-c-s3                  0.6.4               h77088c0_11    conda-forge
aws-c-sdkutils            0.1.19               h038f3f9_2    conda-forge
aws-checksums             0.1.18              h038f3f9_10    conda-forge
aws-crt-cpp               0.28.0               hf262114_1    conda-forge
aws-sdk-cpp               1.11.379             h2b5e2e4_6    conda-forge
azure-core-cpp            1.13.0               h935415a_0    conda-forge
azure-identity-cpp        1.8.0                hd126650_2    conda-forge
azure-storage-blobs-cpp   12.12.0              hd2e3451_0    conda-forge
azure-storage-common-cpp  12.7.0               h10ac4d7_1    conda-forge
azure-storage-files-datalake-cpp 12.11.0              h325d260_1    conda-forge
babel                     2.13.0             pyhd8ed1ab_0    conda-forge
backcall                  0.2.0              pyh9f0ad1d_0    conda-forge
backports                 1.0                pyhd8ed1ab_3    conda-forge
backports.functools_lru_cache 1.6.5              pyhd8ed1ab_0    conda-forge
beautifulsoup4            4.12.2             pyha770c72_0    conda-forge
bidict                    0.23.1             pyhd8ed1ab_0    conda-forge
bleach                    6.1.0              pyhd8ed1ab_0    conda-forge
blinker                   1.6.3              pyhd8ed1ab_0    conda-forge
blosc                     1.21.6               hef167b5_0    conda-forge
bqplot                    0.12.43            pyhd8ed1ab_0    conda-forge
branca                    0.7.2              pyhd8ed1ab_0    conda-forge
brotli                    1.1.0                hd590300_1    conda-forge
brotli-bin                1.1.0                hd590300_1    conda-forge
brotli-python             1.1.0           py311hb755f60_1    conda-forge
bzip2                     1.0.8                h7f98852_4    conda-forge
c-ares                    1.33.1               heb4867d_0    conda-forge
ca-certificates           2024.7.4             hbcca054_0    conda-forge
cached-property           1.5.2                hd8ed1ab_1    conda-forge
cached_property           1.5.2              pyha770c72_1    conda-forge
cairo                     1.18.0               hebfffa5_3    conda-forge
certifi                   2024.7.4           pyhd8ed1ab_0    conda-forge
certipy                   0.1.3                      py_0    conda-forge
cffi                      1.16.0          py311hb3a22ac_0    conda-forge
cfitsio                   4.4.1                hf8ad068_0    conda-forge
charset-normalizer        3.3.0              pyhd8ed1ab_0    conda-forge
click                     8.1.7           unix_pyh707e725_0    conda-forge
click-plugins             1.1.1                      py_0    conda-forge
cligj                     0.7.2              pyhd8ed1ab_1    conda-forge
code-server               4.23.1               hafe34db_1    conda-forge
colorama                  0.4.6              pyhd8ed1ab_0    conda-forge
colour                    0.1.5              pyhd8ed1ab_1    conda-forge
comm                      0.1.4              pyhd8ed1ab_0    conda-forge
configurable-http-proxy   4.6.2                he2f69ee_0    conda-forge
contourpy                 1.2.1           py311h9547e67_0    conda-forge
cryptography              41.0.4          py311h63ff55d_0    conda-forge
cycler                    0.12.1             pyhd8ed1ab_0    conda-forge
debugpy                   1.8.0           py311hb755f60_1    conda-forge
decorator                 5.1.1              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
entrypoints               0.4                pyhd8ed1ab_0    conda-forge
exceptiongroup            1.1.3              pyhd8ed1ab_0    conda-forge
executing                 1.2.0              pyhd8ed1ab_0    conda-forge
expat                     2.6.2                h59595ed_0    conda-forge
filelock                  3.15.4             pyhd8ed1ab_0    conda-forge
fiona                     1.9.6           py311h3c39baf_4    conda-forge
fmt                       11.0.2               h434a139_0    conda-forge
folium                    0.17.0             pyhd8ed1ab_0    conda-forge
font-ttf-dejavu-sans-mono 2.37                 hab24e00_0    conda-forge
font-ttf-inconsolata      3.000                h77eed37_0    conda-forge
font-ttf-source-code-pro  2.038                h77eed37_0    conda-forge
font-ttf-ubuntu           0.83                 h77eed37_2    conda-forge
fontconfig                2.14.2               h14ed4e7_0    conda-forge
fonts-conda-ecosystem     1                             0    conda-forge
fonts-conda-forge         1                             0    conda-forge
fonttools                 4.53.1          py311h61187de_0    conda-forge
fqdn                      1.5.1              pyhd8ed1ab_0    conda-forge
freetype                  2.12.1               h267a509_2    conda-forge
freexl                    2.0.0                h743c826_0    conda-forge
fribidi                   1.0.10               h36c2ea0_0    conda-forge
frozenlist                1.4.1           py311h459d7ec_0    conda-forge
fsspec                    2024.6.1           pyhff2d567_0    conda-forge
gdal                      3.9.2           py311hb17e472_0    conda-forge
gdk-pixbuf                2.42.12              hb9ae30d_0    conda-forge
gdown                     5.2.0              pyhd8ed1ab_0    conda-forge
geojson                   3.1.0              pyhd8ed1ab_0    conda-forge
geopandas                 0.14.4             pyhd8ed1ab_0    conda-forge
geopandas-base            0.14.4             pyha770c72_0    conda-forge
geos                      3.12.2               he02047a_1    conda-forge
geotiff                   1.7.3                hf7fa9e8_2    conda-forge
gflags                    2.2.2             he1b5a44_1004    conda-forge
giflib                    5.2.2                hd590300_0    conda-forge
git                       2.46.0          pl5321hb5640b7_0    conda-forge
glog                      0.7.1                hbabe93e_0    conda-forge
gmp                       6.2.1                h58526e2_0    conda-forge
graphite2                 1.3.13            h59595ed_1003    conda-forge
graphviz                  12.0.0               hba01fac_0    conda-forge
greenlet                  3.0.3                    pypi_0    pypi
gtk2                      2.24.33              h6470451_5    conda-forge
gts                       0.7.6                h977cf35_4    conda-forge
h11                       0.14.0             pyhd8ed1ab_0    conda-forge
h2                        4.1.0              pyhd8ed1ab_0    conda-forge
harfbuzz                  9.0.0                hda332d3_1    conda-forge
hdf4                      4.2.15               h2a13503_7    conda-forge
hdf5                      1.14.3          nompi_hdf9ad27_105    conda-forge
hpack                     4.0.0              pyh9f0ad1d_0    conda-forge
htmltools                 0.5.3              pyhd8ed1ab_0    conda-forge
httpcore                  1.0.5              pyhd8ed1ab_0    conda-forge
httpx                     0.27.2             pyhd8ed1ab_0    conda-forge
humanize                  4.10.0             pyhd8ed1ab_0    conda-forge
hyperframe                6.0.1              pyhd8ed1ab_0    conda-forge
ibis-framework            9.3.0                hd8ed1ab_0    conda-forge
ibis-framework-core       9.3.0              pyhd8ed1ab_0    conda-forge
icu                       75.1                 he02047a_0    conda-forge
idna                      3.4                pyhd8ed1ab_0    conda-forge
importlib-metadata        6.8.0              pyha770c72_0    conda-forge
importlib-resources       6.1.0              pyhd8ed1ab_0    conda-forge
importlib_metadata        6.8.0                hd8ed1ab_0    conda-forge
importlib_resources       6.1.0              pyhd8ed1ab_0    conda-forge
ipyevents                 2.0.2              pyhd8ed1ab_0    conda-forge
ipyfilechooser            0.6.0              pyhd8ed1ab_0    conda-forge
ipykernel                 6.25.2             pyh2140261_0    conda-forge
ipyleaflet                0.19.2             pyhd8ed1ab_0    conda-forge
ipysheet                  0.7.0              pyhd8ed1ab_0    conda-forge
ipython                   8.16.1             pyh0d859eb_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
ipytree                   0.2.2              pyhd8ed1ab_0    conda-forge
ipyvue                    1.11.0             pyhd8ed1ab_0    conda-forge
ipyvuetify                1.10.0             pyhd8ed1ab_0    conda-forge
ipywidgets                8.1.1              pyhd8ed1ab_0    conda-forge
isoduration               20.11.0            pyhd8ed1ab_0    conda-forge
jedi                      0.19.1             pyhd8ed1ab_0    conda-forge
jinja2                    3.1.4              pyhd8ed1ab_0    conda-forge
joblib                    1.4.2              pyhd8ed1ab_0    conda-forge
json-c                    0.17                 h1220068_1    conda-forge
json5                     0.9.14             pyhd8ed1ab_0    conda-forge
jsonpointer               2.4             py311h38be061_3    conda-forge
jsonschema                4.19.1             pyhd8ed1ab_0    conda-forge
jsonschema-specifications 2023.7.1           pyhd8ed1ab_0    conda-forge
jsonschema-with-format-nongpl 4.19.1             pyhd8ed1ab_0    conda-forge
jupyter-lsp               2.2.5              pyhd8ed1ab_0    conda-forge
jupyter-offlinenotebook   0.2.2              pyh1d7be83_0    conda-forge
jupyter-resource-usage    1.1.0              pyhd8ed1ab_0    conda-forge
jupyter-server-proxy      4.4.0              pyhd8ed1ab_0    conda-forge
jupyter-vscode-proxy      0.6                pyhd8ed1ab_0    conda-forge
jupyter_client            7.4.9              pyhd8ed1ab_0    conda-forge
jupyter_core              5.4.0           py311h38be061_0    conda-forge
jupyter_events            0.10.0             pyhd8ed1ab_0    conda-forge
jupyter_leaflet           0.19.2             pyhd8ed1ab_0    conda-forge
jupyter_server            2.14.2             pyhd8ed1ab_0    conda-forge
jupyter_server_fileid     0.9.0              pyhd8ed1ab_0    conda-forge
jupyter_server_terminals  0.5.3              pyhd8ed1ab_0    conda-forge
jupyter_server_ydoc       0.8.0              pyhd8ed1ab_0    conda-forge
jupyter_telemetry         0.1.0              pyhd8ed1ab_1    conda-forge
jupyter_ydoc              0.2.4              pyhd8ed1ab_0    conda-forge
jupyterhub                4.1.6              pyh31011fe_0    conda-forge
jupyterhub-base           4.1.6              pyh31011fe_0    conda-forge
jupyterhub-singleuser     4.1.6              pyh31011fe_0    conda-forge
jupyterlab                4.2.5              pyhd8ed1ab_0    conda-forge
jupyterlab-myst           2.4.2              pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.2.2              pyhd8ed1ab_0    conda-forge
jupyterlab_server         2.27.3             pyhd8ed1ab_0    conda-forge
jupyterlab_widgets        3.0.9              pyhd8ed1ab_0    conda-forge
kealib                    1.5.3                hee9dde6_1    conda-forge
keyutils                  1.6.1                h166bdaf_0    conda-forge
kiwisolver                1.4.5           py311h9547e67_1    conda-forge
krb5                      1.21.3               h659f571_0    conda-forge
lcms2                     2.16                 hb7c19ff_0    conda-forge
ld_impl_linux-64          2.40                 h41732ed_0    conda-forge
leafmap                   0.36.10            pyhd8ed1ab_0    conda-forge
lerc                      4.0.0                h27087fc_0    conda-forge
libabseil                 20240116.2      cxx17_he02047a_1    conda-forge
libaec                    1.1.3                h59595ed_0    conda-forge
libarchive                3.7.4                hfca40fe_0    conda-forge
libarrow                  17.0.0          h974b3c2_11_cpu    conda-forge
libarrow-acero            17.0.0          h5888daf_11_cpu    conda-forge
libarrow-dataset          17.0.0          h5888daf_11_cpu    conda-forge
libarrow-substrait        17.0.0          hf54134d_11_cpu    conda-forge
libblas                   3.9.0           23_linux64_openblas    conda-forge
libbrotlicommon           1.1.0                hd590300_1    conda-forge
libbrotlidec              1.1.0                hd590300_1    conda-forge
libbrotlienc              1.1.0                hd590300_1    conda-forge
libcblas                  3.9.0           23_linux64_openblas    conda-forge
libcrc32c                 1.1.2                h9c3ff4c_0    conda-forge
libcurl                   8.9.1                hdb1bdb2_0    conda-forge
libdeflate                1.21                 h4bc722e_0    conda-forge
libedit                   3.1.20191231         he28a2e2_2    conda-forge
libev                     4.33                 hd590300_2    conda-forge
libevent                  2.1.12               hf998b51_1    conda-forge
libexpat                  2.6.2                h59595ed_0    conda-forge
libffi                    3.4.2                h7f98852_5    conda-forge
libgcc-ng                 13.2.0               h807b86a_2    conda-forge
libgd                     2.3.3               hd3e95f3_10    conda-forge
libgdal                   3.9.2                ha770c72_0    conda-forge
libgdal-core              3.9.2                hba09cee_0    conda-forge
libgdal-fits              3.9.2                hdd6600c_0    conda-forge
libgdal-grib              3.9.2                h5f34788_0    conda-forge
libgdal-hdf4              3.9.2                ha39a594_0    conda-forge
libgdal-hdf5              3.9.2                ha2ed5f0_0    conda-forge
libgdal-jp2openjpeg       3.9.2                h2ebfdf0_0    conda-forge
libgdal-kea               3.9.2                h2b45729_0    conda-forge
libgdal-netcdf            3.9.2                h94e7027_0    conda-forge
libgdal-pdf               3.9.2                h0fa2cb4_0    conda-forge
libgdal-pg                3.9.2                he047751_0    conda-forge
libgdal-postgisraster     3.9.2                he047751_0    conda-forge
libgdal-tiledb            3.9.2                h9d8aadb_0    conda-forge
libgdal-xls               3.9.2                h062f1c4_0    conda-forge
libgfortran-ng            13.2.0              h69a702a_13    conda-forge
libgfortran5              13.2.0              h3d2ce59_13    conda-forge
libglib                   2.80.3               h315aac3_2    conda-forge
libgomp                   13.2.0               h807b86a_2    conda-forge
libgoogle-cloud           2.28.0               h26d7fe4_0    conda-forge
libgoogle-cloud-storage   2.28.0               ha262f82_0    conda-forge
libgrpc                   1.62.2               h15f2491_0    conda-forge
libiconv                  1.17                 hd590300_2    conda-forge
libjpeg-turbo             3.0.0                hd590300_1    conda-forge
libkml                    1.3.0             hf539b9f_1021    conda-forge
liblapack                 3.9.0           23_linux64_openblas    conda-forge
libnetcdf                 4.9.2           nompi_h135f659_114    conda-forge
libnghttp2                1.58.0               h47da74e_1    conda-forge
libnsl                    2.0.1                hd590300_0    conda-forge
libopenblas               0.3.27          pthreads_hac2b453_1    conda-forge
libparquet                17.0.0          h39682fd_11_cpu    conda-forge
libpng                    1.6.43               h2797004_0    conda-forge
libpq                     16.4                 h482b261_0    conda-forge
libprotobuf               4.25.3               h08a7969_0    conda-forge
libre2-11                 2023.09.01           h5a48ba9_2    conda-forge
librsvg                   2.58.3               h9564881_0    conda-forge
librttopo                 1.1.0               hc670b87_16    conda-forge
libsodium                 1.0.18               h36c2ea0_1    conda-forge
libspatialindex           2.0.0                he02047a_0    conda-forge
libspatialite             5.1.0                h15fa968_9    conda-forge
libsqlite                 3.46.0               hde9e2c9_0    conda-forge
libssh2                   1.11.0               h0841786_0    conda-forge
libstdcxx-ng              13.2.0               h7e041cc_2    conda-forge
libthrift                 0.20.0               h0e7cc3e_1    conda-forge
libtiff                   4.6.0                h46a8edc_4    conda-forge
libutf8proc               2.8.0                h166bdaf_0    conda-forge
libuuid                   2.38.1               h0b41bf4_0    conda-forge
libuv                     1.48.0               hd590300_0    conda-forge
libwebp-base              1.4.0                hd590300_0    conda-forge
libxcb                    1.16                 hb9d3cd8_1    conda-forge
libxcrypt                 4.4.36               hd590300_1    conda-forge
libxml2                   2.12.7               he7c6b58_4    conda-forge
libzip                    1.10.1               h2629f0a_3    conda-forge
libzlib                   1.3.1                h4ab18f5_1    conda-forge
linkify-it-py             2.0.3              pyhd8ed1ab_0    conda-forge
lz4-c                     1.9.4                hcb278e6_0    conda-forge
lzo                       2.10              hd590300_1001    conda-forge
mako                      1.2.4              pyhd8ed1ab_0    conda-forge
mapclassify               2.8.0              pyhd8ed1ab_0    conda-forge
maplibre                  0.2.6              pyhd8ed1ab_0    conda-forge
markdown-it-py            3.0.0              pyhd8ed1ab_0    conda-forge
markupsafe                2.1.3           py311h459d7ec_1    conda-forge
matplotlib-base           3.9.2           py311h74b4f7c_0    conda-forge
matplotlib-inline         0.1.6              pyhd8ed1ab_0    conda-forge
mdit-py-plugins           0.4.1              pyhd8ed1ab_0    conda-forge
mdurl                     0.1.2              pyhd8ed1ab_0    conda-forge
minizip                   4.0.7                h401b404_0    conda-forge
mistune                   3.0.1              pyhd8ed1ab_0    conda-forge
multidict                 6.0.5           py311h459d7ec_0    conda-forge
multipledispatch          0.6.0              pyhd8ed1ab_1    conda-forge
munkres                   1.1.4              pyh9f0ad1d_0    conda-forge
narwhals                  1.5.5              pyhd8ed1ab_0    conda-forge
nbclassic                 1.0.0              pyhb4ecaf3_1    conda-forge
nbclient                  0.8.0              pyhd8ed1ab_0    conda-forge
nbconvert                 7.16.4                   pypi_0    pypi
nbconvert-pandoc          7.9.2              pyhd8ed1ab_0    conda-forge
nbformat                  5.9.2              pyhd8ed1ab_0    conda-forge
nbgitpuller               1.2.1              pyhd8ed1ab_0    conda-forge
ncurses                   6.5                  he02047a_1    conda-forge
nest-asyncio              1.5.8              pyhd8ed1ab_0    conda-forge
networkx                  3.3                pyhd8ed1ab_1    conda-forge
nodejs                    18.20.3              hc19f0b3_1    conda-forge
notebook                  7.2.2              pyhd8ed1ab_0    conda-forge
notebook-shim             0.2.3              pyhd8ed1ab_0    conda-forge
nspr                      4.35                 h27087fc_0    conda-forge
nss                       3.103                h593d115_0    conda-forge
numpy                     1.26.4          py311h64a7726_0    conda-forge
oauthlib                  3.2.2              pyhd8ed1ab_0    conda-forge
openjpeg                  2.5.2                h488ebb8_0    conda-forge
openssl                   3.3.1                hb9d3cd8_3    conda-forge
orc                       2.0.2                h669347b_0    conda-forge
overrides                 7.7.0              pyhd8ed1ab_0    conda-forge
packaging                 23.2               pyhd8ed1ab_0    conda-forge
pamela                    1.1.0              pyh1a96a4e_0    conda-forge
pandas                    2.2.2           py311h14de704_1    conda-forge
pandoc                    3.3                  ha770c72_0    conda-forge
pandocfilters             1.5.0              pyhd8ed1ab_0    conda-forge
pango                     1.54.0               h4c5309f_1    conda-forge
parso                     0.8.3              pyhd8ed1ab_0    conda-forge
parsy                     2.1                pyhd8ed1ab_0    conda-forge
patsy                     0.5.6              pyhd8ed1ab_0    conda-forge
pcre2                     10.44                hba22ea6_2    conda-forge
perl                      5.32.1          7_hd590300_perl5    conda-forge
pexpect                   4.8.0              pyh1a96a4e_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    10.4.0          py311h82a398c_0    conda-forge
pins                      0.8.6              pyhd8ed1ab_0    conda-forge
pip                       24.2               pyh8b19718_1    conda-forge
pixman                    0.43.2               h59595ed_0    conda-forge
pkgutil-resolve-name      1.3.10             pyhd8ed1ab_1    conda-forge
platformdirs              3.11.0             pyhd8ed1ab_0    conda-forge
playwright                1.46.0                   pypi_0    pypi
plotly                    5.23.0             pyhd8ed1ab_0    conda-forge
pmtiles                   3.4.0              pyhd8ed1ab_0    conda-forge
poppler                   24.08.0              h47131b8_1    conda-forge
poppler-data              0.4.12               hd8ed1ab_0    conda-forge
postgresql                16.4                 ha8faf9a_0    conda-forge
proj                      9.4.1                h54d7996_1    conda-forge
prometheus_client         0.17.1             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.39             pyha770c72_0    conda-forge
prompt_toolkit            3.0.39               hd8ed1ab_0    conda-forge
pscript                   0.7.7              pyhd8ed1ab_0    conda-forge
psutil                    5.9.5           py311h459d7ec_1    conda-forge
psygnal                   0.11.1             pyhd8ed1ab_0    conda-forge
pthread-stubs             0.4               h36c2ea0_1001    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pure_eval                 0.2.2              pyhd8ed1ab_0    conda-forge
pyarrow                   17.0.0          py311hbd00459_1    conda-forge
pyarrow-core              17.0.0          py311h4510849_1_cpu    conda-forge
pyarrow-hotfix            0.6                pyhd8ed1ab_0    conda-forge
pycparser                 2.21               pyhd8ed1ab_0    conda-forge
pycrs                     1.0.2                      py_0    conda-forge
pycurl                    7.45.3          py311h3393d6f_1    conda-forge
pydantic                  2.8.2              pyhd8ed1ab_0    conda-forge
pydantic-core             2.20.1          py311hb3a8bbb_0    conda-forge
pyee                      11.1.0                   pypi_0    pypi
pygments                  2.16.1             pyhd8ed1ab_0    conda-forge
pyjwt                     2.8.0              pyhd8ed1ab_0    conda-forge
pyopenssl                 23.2.0             pyhd8ed1ab_1    conda-forge
pyparsing                 3.1.4              pyhd8ed1ab_0    conda-forge
pyproj                    3.6.1           py311ha1c4eca_8    conda-forge
pyshp                     2.3.1              pyhd8ed1ab_0    conda-forge
pysocks                   1.7.1              pyha2e5f31_6    conda-forge
pystac                    1.10.1             pyhd8ed1ab_0    conda-forge
pystac-client             0.8.3              pyhd8ed1ab_0    conda-forge
python                    3.11.9          hb806964_0_cpython    conda-forge
python-box                7.2.0           py311h331c9d8_0    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python-duckdb             1.0.0           py311hf86e51f_0    conda-forge
python-fastjsonschema     2.18.1             pyhd8ed1ab_0    conda-forge
python-graphviz           0.20.3             pyh717bed2_0    conda-forge
python-json-logger        2.0.7              pyhd8ed1ab_0    conda-forge
python-multipart          0.0.9              pyhd8ed1ab_0    conda-forge
python-tzdata             2024.1             pyhd8ed1ab_0    conda-forge
python-xxhash             3.5.0           py311h61187de_0    conda-forge
python_abi                3.11                    4_cp311    conda-forge
pytz                      2023.3.post1       pyhd8ed1ab_0    conda-forge
pyyaml                    6.0.1           py311h459d7ec_1    conda-forge
pyzmq                     24.0.1          py311ha4b6469_1    conda-forge
qhull                     2020.2               h434a139_5    conda-forge
questionary               2.0.1              pyhd8ed1ab_0    conda-forge
re2                       2023.09.01           h7f4b329_2    conda-forge
readline                  8.2                  h8228510_1    conda-forge
referencing               0.30.2             pyhd8ed1ab_0    conda-forge
regex                     2024.7.24       py311h61187de_0    conda-forge
requests                  2.31.0             pyhd8ed1ab_0    conda-forge
rfc3339-validator         0.1.4              pyhd8ed1ab_0    conda-forge
rfc3986-validator         0.1.1              pyh9f0ad1d_0    conda-forge
rich                      13.7.1             pyhd8ed1ab_0    conda-forge
rpds-py                   0.10.6          py311h46250e7_0    conda-forge
rtree                     1.3.0           py311h51bcefd_1    conda-forge
ruamel.yaml               0.17.35         py311h459d7ec_0    conda-forge
ruamel.yaml.clib          0.2.7           py311h459d7ec_2    conda-forge
s2n                       1.5.1                h3400bea_0    conda-forge
scikit-learn              1.5.1           py311hd632256_0    conda-forge
scipy                     1.14.0          py311h0a5b728_2    conda-forge
scooby                    0.10.0             pyhd8ed1ab_0    conda-forge
seaborn                   0.13.2               hd8ed1ab_2    conda-forge
seaborn-base              0.13.2             pyhd8ed1ab_2    conda-forge
send2trash                1.8.2              pyh41d4057_0    conda-forge
setuptools                68.2.2             pyhd8ed1ab_0    conda-forge
shapely                   2.0.6           py311h5925939_0    conda-forge
shiny                     1.0.0              pyhd8ed1ab_0    conda-forge
simpervisor               1.0.0              pyhd8ed1ab_0    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
snappy                    1.2.1                ha2e4443_0    conda-forge
sniffio                   1.3.0              pyhd8ed1ab_0    conda-forge
soupsieve                 2.5                pyhd8ed1ab_1    conda-forge
spdlog                    1.14.1               hed91bc2_1    conda-forge
sqlalchemy                2.0.22          py311h459d7ec_0    conda-forge
sqlglot                   25.9.0             pyhd8ed1ab_0    conda-forge
sqlite                    3.46.0               h6d4b2fc_0    conda-forge
stack_data                0.6.2              pyhd8ed1ab_0    conda-forge
starlette                 0.38.2             pyhd8ed1ab_0    conda-forge
statsmodels               0.14.2          py311h18e1886_0    conda-forge
tenacity                  9.0.0              pyhd8ed1ab_0    conda-forge
terminado                 0.17.1             pyh41d4057_0    conda-forge
threadpoolctl             3.5.0              pyhc1e730c_0    conda-forge
tiledb                    2.25.0               hdf2e2d9_9    conda-forge
tinycss2                  1.2.1              pyhd8ed1ab_0    conda-forge
tk                        8.6.13          noxft_h4845f30_101    conda-forge
toml                      0.10.2             pyhd8ed1ab_0    conda-forge
tomli                     2.0.1              pyhd8ed1ab_0    conda-forge
toolz                     0.12.1             pyhd8ed1ab_0    conda-forge
tornado                   6.3.3           py311h459d7ec_1    conda-forge
tqdm                      4.66.5             pyhd8ed1ab_0    conda-forge
traitlets                 5.11.2             pyhd8ed1ab_0    conda-forge
traittypes                0.2.1              pyh9f0ad1d_2    conda-forge
types-python-dateutil     2.8.19.14          pyhd8ed1ab_0    conda-forge
typing-extensions         4.12.2               hd8ed1ab_0    conda-forge
typing_extensions         4.12.2             pyha770c72_0    conda-forge
typing_utils              0.1.0              pyhd8ed1ab_0    conda-forge
tzcode                    2024a                h3f72095_0    conda-forge
tzdata                    2023c                h71feb2d_0    conda-forge
uc-micro-py               1.0.3              pyhd8ed1ab_0    conda-forge
uri-template              1.3.0              pyhd8ed1ab_0    conda-forge
uriparser                 0.9.8                hac33072_0    conda-forge
urllib3                   2.0.6              pyhd8ed1ab_0    conda-forge
uvicorn                   0.30.6          py311h38be061_0    conda-forge
watchfiles                0.23.0          py311hb3a8bbb_0    conda-forge
wcwidth                   0.2.8              pyhd8ed1ab_0    conda-forge
webcolors                 1.13               pyhd8ed1ab_0    conda-forge
webencodings              0.5.1              pyhd8ed1ab_2    conda-forge
websocket-client          1.8.0              pyhd8ed1ab_0    conda-forge
websockets                13.0            py311h61187de_0    conda-forge
wheel                     0.41.2             pyhd8ed1ab_0    conda-forge
whitebox                  2.3.5              pyhd8ed1ab_0    conda-forge
whiteboxgui               2.3.0              pyhd8ed1ab_0    conda-forge
widgetsnbextension        4.0.9              pyhd8ed1ab_0    conda-forge
wrapt                     1.16.0          py311h459d7ec_0    conda-forge
xerces-c                  3.2.5                h666cd97_1    conda-forge
xorg-kbproto              1.0.7             h7f98852_1002    conda-forge
xorg-libice               1.1.1                hd590300_0    conda-forge
xorg-libsm                1.2.4                h7391055_0    conda-forge
xorg-libx11               1.8.9                hb711507_1    conda-forge
xorg-libxau               1.0.11               hd590300_0    conda-forge
xorg-libxdmcp             1.1.3                h7f98852_0    conda-forge
xorg-libxext              1.3.4                h0b41bf4_2    conda-forge
xorg-libxrender           0.9.11               hd590300_0    conda-forge
xorg-renderproto          0.11.1            h7f98852_1002    conda-forge
xorg-xextproto            7.3.0             h0b41bf4_1003    conda-forge
xorg-xproto               7.0.31            h7f98852_1007    conda-forge
xxhash                    0.8.2                hd590300_0    conda-forge
xyzservices               2024.6.0           pyhd8ed1ab_0    conda-forge
xz                        5.2.6                h166bdaf_0    conda-forge
y-py                      0.5.9           py311hfe55011_0    conda-forge
yaml                      0.2.5                h7f98852_2    conda-forge
yarl                      1.9.4           py311h459d7ec_0    conda-forge
ypy-websocket             0.8.2              pyhd8ed1ab_0    conda-forge
zeromq                    4.3.5                h59595ed_0    conda-forge
zipp                      3.17.0             pyhd8ed1ab_0    conda-forge
zlib                      1.3.1                h4ab18f5_1    conda-forge
zstd                      1.5.6                ha6fb4c9_0    conda-forge

Using this environment.yaml:

name: nature

channels:
- conda-forge

dependencies:

# Items required for basic level functionality
- python==3.11.*
- git==2.46.0
- jupyter-resource-usage=1.1.0
- jupyterhub==4.1.6
- jupyterlab==4.2.5
- jupyter_server==2.14.2
- notebook==7.2.2
- nbgitpuller==1.2.1

# vscode
- code-server==4.23.1
- jupyter-vscode-proxy==0.6

# other packages
- seaborn==0.13.2
- altair==5.4.1
- ibis-framework[pandas,duckdb]==9.3.0
- leafmap==0.36.10
- jupyterlab-myst==2.4.2

- pip==24.2
- pip:
  - nbconvert[webpdf]==7.16.4

My goal here is to start with a reasonable baseline and iterate toward a package selection that meets your needs. I've been throwing in the items mentioned throughout this ticket as well.

cboettig commented 3 months ago

Can you add gh-scoped-creds to the above?

this list looks solid for modules 1+2 (even without leafmap, which brings in a lot), but I probably have to test to be sure. We can now go without altair in modules 1+2. Other than myst I believe this all works on the main hub already which we'll be using next week, so I will be deferring any use of myst until module 2.

leafmap[maplibre] will be needed in module 3, but bumped to the latest version. (If we're lucky https://github.com/eodaGmbH/py-maplibregl/pull/97 will be merged by then!) Still figuring out the remaining spatial dependencies.

Module 4 we are hoping to run using our NAIRR allocation, which promises 'jupyter notebook' support but ... we'll see! It would be useful to have streamlit on the Berkeley machines for module 4 + final project. I think we'll also be using a bunch of langchain in module 4. (yeah we probably should just be using tokens even though I'm keen for students to experience running local models).

felder commented 3 months ago

@cboettig my goal is to get all of the required packages into the nature hub ASAP to provide enough lead time for testing and configuration. I do not want want to wait until a week before you need it to start trying to get stuff in there. Ideally, in the future I'd like to start being able to service package requests a semester in advance so that while the semester is going changes are somewhat limited to non working items (like seaborn earlier in this issue)

Also I'm very unfamiliar with the usage of any of these python modules/libraries you're using for your course.

For example, from your latest comment I gather you want:

streamlit==1.38.0 https://anaconda.org/conda-forge/streamlit langchain, can you please specify which conda-forge packages and versions you want specifically? https://anaconda.org/search?q=langchain

When I try leafmap[maplibre]:


(notebook) jovyan@jupyter-felder:~$ mamba install leafmap[maplibre]

Looking for: ['leafmap']

pkgs/main/linux-64 (check zst)                     Checked  0.1s
pkgs/main/noarch (check zst)                        Checked  0.0s
pkgs/r/linux-64 (check zst)                         Checked  0.0s
pkgs/r/noarch (check zst)                           Checked  0.0s
pkgs/main/noarch                                   715.6kB @   4.7MB/s  0.2s
pkgs/r/linux-64                                      1.6MB @  10.0MB/s  0.2s
pkgs/main/linux-64                                   6.4MB @  26.5MB/s  0.4s
pkgs/r/noarch                                        2.1MB @   5.2MB/s  0.2s
conda-forge/noarch                                  16.2MB @  21.1MB/s  1.0s
conda-forge/linux-64                                37.4MB @  31.2MB/s  2.4s

Pinned packages:
  - python 3.11.*

Transaction

  Prefix: /srv/conda/envs/notebook

  All requested packages already installed

(notebook) jovyan@jupyter-felder:~$ 

So if leafmap[maplibre] is not working, do you have examples or import statements that I could use for testing? Once we're a bit further along, I'm also going to encourage you to do some testing and maybe even submit your own PRs.

cboettig commented 3 months ago

@felder I hear you, definitely want these things to be pinned down in advance if possible too. I'm running on pure pip / venv setup on my end, so I don't fully know my way around conda-forge here (especially when it comes to how conda handles these 'optional' dependencies like maplibre, https://leafmap.org/notebooks/92_maplibre/ I believe having leafmap 36.10 and py-maplibregl installed should work...

felder commented 3 months ago

@cboettig yeah we can use pip as a fallback if conda does not do the right thing, you can see an example of that for nbconvert here: https://github.com/berkeley-dsep-infra/datahub/blob/8e647bf0053c689f8ece857ef724d6e89d7c06b6/deployments/nature/image/environment.yml#L31

Also one thing I'd like to do is make sure we version lock packages you know you'll be importing for your assignments once we verify they work, that way we won't have them upgrading and potentially breaking on us later.

felder commented 3 months ago

@cboettig ok, gh-scoped-creds is in. I'm not sure how to test maplibre, but this seems to do something:

Screenshot 2024-08-30 at 3 51 05 PM

I invite you to try out the new hub and we can start working on items that don't work or are missing.

This is the production version of the hub: https://nature.datahub.berkeley.edu

cboettig commented 3 months ago

looks good to me! I'll start running through my modules there. we'll see how this goes!

cboettig commented 3 months ago

ok on the new hub now but already realizing I forgot some things.

felder commented 3 months ago

@cboettig keep those missing packages coming, and I'll get'm in there but it won't be until Tuesday.

cboettig commented 2 months ago
felder commented 2 months ago

@cboettig just checking in. Does everything look ok for nature hub? Packages look good? Notebooks working?

cboettig commented 2 months ago

@felder thanks much, it's been great so far! I owe you a few more modules we'll need in a month or so but I'm still testing. Should have a few more spatial packages to add soon.

Based on today I did have one question. Would it be possible to configure things so that the default behavior for git is

git config --system pull.rebase false

Git doesn't have any default strategy, with result that the Git interface will simply fail in any merge situation because the user hasn't set this. I know I can have the students run this config in the terminal (with --global), but I'd rather this just be a default. (Not sure if --system is the best choice or if it's easier to set things up to write a config to the user's home at startup.

felder commented 2 months ago

@cboettig Is this a setting that every course that might potentially use nature hub would want?

After running the above on my own server I see:

(notebook) jovyan@jupyter-felder:/srv/conda/etc$ git config --list --system --show-origin
file:/srv/conda/envs/notebook/etc/gitconfig     http.sslverify=true
file:/srv/conda/envs/notebook/etc/gitconfig     http.sslcapath=/srv/conda/envs/notebook/ssl/cacert.pem
file:/srv/conda/envs/notebook/etc/gitconfig     http.sslcainfo=/srv/conda/envs/notebook/ssl/cacert.pem
file:/srv/conda/envs/notebook/etc/gitconfig     pull.rebase=false

Given that the $(prefix) for --system appears to be /srv/conda/envs/notebook/etc/gitconfig I can add a postBuild step (https://github.com/berkeley-dsep-infra/nature-user-image/blob/main/postBuild) that will set this, but doing so is going to alter the behavior across the board.

Would it be preferable to set this on a per repo basis so each course can choose the behavior they want?

Also I should add that modifying user home directories on startup is not preferable and I don't think we'd want to rely on any solutions that attempted to do that.

cboettig commented 2 months ago

@felder right, I believe this should be the default for all users, and I recognize we'd rather not modify home dir, which are both reasons I suggested using --system. Users can rebase pulls when they want, but to quote the git documentation,

This is a potentially dangerous mode of operation. It rewrites history, which does not bode well [...]

I know re-basing to have a 'clean history' rather than merge commits became vogue at some point, but I think re-base is an advanced technique that needs to be done with intention and one does not re-write the hash tree lightly. Originally this was how git always behaved, (I think the ability to make pull.rebase true as a configuration was introduced in git 1.7.9), and most documentation/stackoverflows etc still describe pull.rebase false as the "default" strategy, though technically there really isn't a default any more. We're using the jupyterhub-git plugin to interact with git, which clearly isn't designed to handle rebase (and the dreaded 'detached HEAD' state), so I'm confident this is the safe default.

felder commented 2 months ago

@cboettig the git settings change will be live on nature hub prod shortly.

balajialg commented 2 months ago

@cboettig It seems like the changes you requested have been resolved by @felder. Can we close this issue for now? You can open a new issue when you need additional packages. Let us know!