diff --git a/content/Blog/jupyter_ecosystem.rst b/content/Blog/jupyter_ecosystem.rst
index 5956e97..b8e9426 100644
--- a/content/Blog/jupyter_ecosystem.rst
+++ b/content/Blog/jupyter_ecosystem.rst
@@ -3,21 +3,59 @@ The Wild West of Jupyter
:date: 2024-02-13
:authors: Matt Gibson
+:modified: 2024-04-20 18:59
-There's some wacky stuff in the Jupyter ecosystem, but I think on thing that really stood out for me is the extension of jupyter notebooks into web development and the interaction with javascript. So web assembly is a thing and you can run C code little isolated javascripts instances, maybe even from your CDN, so of course you want to compile `Python in WASM `_, and now you're wondering, didn't Jupyter do some fancy refactoring and that I think about I can put a webserver in there too...
+There's some wacky stuff in the Jupyter ecosystem. Still, one thing that really stood out for me was the extension of Jupyter notebooks into web development and their interaction with the JavaScript ecosystem. So web assembly is a thing, and you can run C and Rust code inside little isolated JavaScript sandboxes instances, maybe even from `your CDN `_, so of course you want to compile `Python in WASM `_. Now you're wondering, didn't Jupyter do some fancy refactoring a while ago? I wonder if I can put a webserver up there, too...
Behold `JupyterLite `_:
-.. raw:: html
+.. raw:: HTML
-
+
-Wow! Just what you always wanted free notebook hosting! you can install packages, you can code,
+Wow! Just what you always wanted: free notebook hosting! you can install packages, you can code, powered by this:
-powered by this:
-https://jupyterlite.readthedocs.io/en/latest/_images/jupyterlite-diagram.svg
\ No newline at end of file
+.. figure:: {static}/images/jupyterlite-diagram.svg
+ :width: 600px
+ :alt: JupyterLite architecture diagram
+ :figclass: center
+
+ `(source 1) `_
+
+Comparing this with the standard architecture for Jupyter:
+
+.. figure:: {static}/images/notebook_components.png
+ :width: 600px
+ :alt: Jupyter notebook architecture diagram
+ :figclass: center
+
+ `(source 2) `_
+
+
+You see, one basically has to reimplement the server side of Jupyter in the browser. This is not a small task because Jupyter Server depends on more hefty libraries like ZeroMQ and Tornado, but presumably, compiling to WASM is useful.
+
+I don't have an excellent knowledge of the history of the Jupyter project. Still, I remember this whole thing blowing up in about 2015 with `the big split `_. The big split was a drive to make Jupyter language agnostic, which, as I understand, is more or less successful; nowadays, you can run R, Julia, and even C++ in a Jupyter notebook. It's not really appreciated how much the whole project has ballooned:
+
+.. figure:: {static}/images/repos_map.png
+ :width: 600px
+ :alt: A map of the Jupyter project repositories
+ :figclass: center
+
+ `(source 3) `_
+
+and that's just the offical projects! You probably know about related things like `nbconvert `_, `JupyterLab `_ and `IPython `_. There are some funny spin-of (besides jupyterlite) that you may or may not be aware of
+
+- `traitlets `_
+- `ipywidgets `_
+- `Zeus `_
+- `Jupyterhub `_
+- `Lumino `_
+
+Another exciting thing is that Colaboratory and VSCode have non-standard implementations of the client side of the Jupyter (ask me how I know). In fact there's a whole ecosystem (built on the ricketty foundation of ipywidgets) for web development with Jupyter: `voila `_, `Mercury `_ and `Solara `_ aiming to compete `streamlit `_ for the affluent market consisting of data scientists who would literally prefer to do anything than write javascript.
+
+My use case for Jupyter notebooks is primarily for exploratory data analysis and expository stuff. Early in my PhD, I had a few bad experiences with state preservation, which soured me to use it for more serious projects. You are probably aware `that opinion is controversial `_. I like the literate programming approach of `Rmarkdown/quarto `_ (it supports Python now, so check it out) much more because it solves the issues with the non-transparent notebook blob of JSON in the ipynb format and allows better IDE integration. One direction of this is ipynb to ipynb; Jupyter has an equivalent for a while, `nbconvert `_. It's only recently that py to ipynb has standardised on `Jupytext `_ (although there's also `nbdev `_). It's interesting that Jupytext (it's used, for instance, in the VSCode implementation of notebooks) that it's not part of the core ecosystem. Is the whole project a horrible mess in scope creep, or is it a shining example of the power of open source? I don't know, but the Jupyter project has been shaped by the community's needs in unexpected ways.
\ No newline at end of file
diff --git a/content/images/jupyterlite-diagram.svg b/content/images/jupyterlite-diagram.svg
new file mode 100644
index 0000000..e3f1d75
--- /dev/null
+++ b/content/images/jupyterlite-diagram.svg
@@ -0,0 +1,237 @@
+
\ No newline at end of file
diff --git a/content/images/notebook_components.png b/content/images/notebook_components.png
new file mode 100644
index 0000000..d45db8d
Binary files /dev/null and b/content/images/notebook_components.png differ
diff --git a/content/images/repos_map.png b/content/images/repos_map.png
new file mode 100644
index 0000000..c34a533
Binary files /dev/null and b/content/images/repos_map.png differ
diff --git a/themes/my-basic/static/css/style.css b/themes/my-basic/static/css/style.css
index 0f0658a..1a4a8f5 100644
--- a/themes/my-basic/static/css/style.css
+++ b/themes/my-basic/static/css/style.css
@@ -1,7 +1,7 @@
@import url("normalize.css");
/* ##########*/
-/* Defaults */
+/* Vars */
/* ##########*/
:root {
@@ -22,6 +22,10 @@
/* 18px h5 font-size: 1.143em */
/* 16px h6 font-size: 1em */
+ /* this needs to be the same for dark and light */
+ --figure-background: #f8f8f8;
+
+
/*------------*/
/* light mode */
/*------------*/
@@ -35,7 +39,9 @@
--border: #cdcdcd;
}
-/* Dark mode */
+/* ##################### */
+/* styling for darkmode */
+/* ##################### */
.dark {
--text-primary: #fff;
@@ -48,12 +54,10 @@
--border: #858585;
}
-h1, h2, h3, nav {
- font-family: var(--my-monospace-code);
-}
-nav a {
- color: var(--text-secondary)
-}
+/* ####################### */
+/* styling for typography */
+/* ####################### */
+
body {
font-family: var(--my-neo-grotesque);
@@ -104,9 +108,18 @@ hr {
}
-/* ################*/
-/* styling for nav */
-/* ################*/
+/* ################ */
+/* styling for nav */
+/* ################ */
+
+h1, h2, h3, nav {
+ font-family: var(--my-monospace-code);
+}
+nav a {
+ color: var(--text-secondary)
+}
+
+
nav {
justify-content: space-between;
}
@@ -144,6 +157,9 @@ nav a:hover {
}
+/* ########################### */
+/* styling for main & article */
+/* ########################### */
main a:link {
color: var(--text-link);
@@ -162,10 +178,9 @@ main a:visited {
text-decoration-thickness: 0.1em;
}
-/* styling for code */
+/* article */
-/* for articles */
article {
padding: 0 0 0.75em 0;
border-bottom: 1px solid var(--border);
@@ -183,6 +198,12 @@ article footer {
padding-top: 0.5em;
}
+/* footer */
+
+footer {
+ font-size: var(--small-font-size);
+}
+
address {
font-style: normal;
}
@@ -190,14 +211,20 @@ address {
article footer address, footer time {
display: inline;
}
-footer {
- font-size: var(--small-font-size);
+/* figure class */
+.figure {
+ margin: 0.5em 0;
+ background-color: var(--figure-background);
}
-/* styling buttons */
-/* cute nonsense for toggle darkmode */
+
+
+/* ############################### */
+/* styling for dark toggle button */
+/* ############################### */
+
body.dark #moon{
display: none;
}