bondscell_results$8ea7b7f4-e383-11ed-15db-21da2abf4ed8queued¤logsrunning¦outputbody

Weekly notes 25 april 2023

Topics:

mimetext/htmlrootassigneelast_run_timestampAڅBqpersist_js_state·has_pluto_hook_features§cell_id$8ea7b7f4-e383-11ed-15db-21da2abf4ed8depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$e4fea5a1-94f4-4e70-80b0-327deaec9369queued¤logsrunning¦outputbody

JuliaSyntax

https://github.com/fonsp/Pluto.jl/pull/2526

Gave Paul more ideas! Maybe we could us it as part of ExpressionExplorer.

Maybe then we don't need scopestate_statefield.js ? But right now we also use it for local changes, i.e. when you type code before you click Shift+Enter.

For merging the Operational Transform PR: the dirty cell states will also be shared with the server, so we can add this in that process: for each :push_changes (broadcast of local changes), we can also run JuliaSyntax.jl and make the epxressionexplorer result (with ranges) part of the state/update.

Then we can do cooler things like renaming a variable across the whole notebook! Because the JS based version that we have right now is not accurate enough.

Maybe make a WASM version of just JuliaSyntax.parse 😳

We need to still support Expr to deal with macro expansions. Maybe this works?

ExpressionExplorer.explore(expr::Expr) = JuliaSytax.parse(string(expr))

If we publish ExpressionExplorer then there are lots of cool projects that we can do!

Maybe standalone ExpressionExplorer is a bit weird without Pluto's macro handling.

mimetext/htmlrootassigneelast_run_timestampAڅBm7persist_js_state·has_pluto_hook_features§cell_id$e4fea5a1-94f4-4e70-80b0-327deaec9369depends_on_disabled_cells§runtime ZLpublished_object_keysdepends_on_skipped_cells§errored$a623e733-c47f-470a-85ff-d5649cbf6926queued¤logsrunning¦outputbody
@reactive begin
	y = 2 + x
	
	x = 1
end
mimetext/htmlrootassigneelast_run_timestampAڅBpersist_js_state·has_pluto_hook_features§cell_id$a623e733-c47f-470a-85ff-d5649cbf6926depends_on_disabled_cells§runtime[published_object_keysdepends_on_skipped_cells§errored$9f92a70b-de55-4677-80d8-32d201247235queued¤logsrunning¦outputbodyل

JupyterCon!

Preparing a talk for JupyterCon! Notes so far:

mimetext/htmlrootassigneelast_run_timestampAڅB5persist_js_state·has_pluto_hook_features§cell_id$9f92a70b-de55-4677-80d8-32d201247235depends_on_disabled_cells§runtime-8published_object_keysdepends_on_skipped_cells§errored$ecd7f415-1fcf-480f-b522-b05bcd42c4ecqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅC XS3persist_js_state·has_pluto_hook_features§cell_id$ecd7f415-1fcf-480f-b522-b05bcd42c4ecdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8512c5aa-077f-4329-9d1f-2b5c66edb74equeued¤logsrunning¦outputbodymsgMethodError: no method matching ExpressionExplorer.ReactiveNode(::String) The type `ExpressionExplorer.ReactiveNode` exists, but no method is defined for this combination of argument types when trying to construct it. Closest candidates are:  ExpressionExplorer.ReactiveNode(::Any, ::Any, ::Any, ::Any, ::Any, ::Any)  @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:14  ExpressionExplorer.ReactiveNode(::Set{Symbol}, ::Set{Symbol}, ::Set{Symbol}, ::Set{ExpressionExplorer.FunctionNameSignaturePair}, ::Set{Symbol}, ::Set{Symbol})  @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:14  ExpressionExplorer.ReactiveNode(; references, definitions, soft_definitions, funcdefs_with_signatures, funcdefs_without_signatures, macrocalls)  @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:13  ... stacktracecall_shortmacro expansioninlinedãurlpathw/home/runner/work/community-call-notes/community-call-notes/2023/04-25/notes.jl#==#8512c5aa-077f-4329-9d1f-2b5c66edb74esource_packagecallmacro expansionlinfo_typeNothinglinefile0notes.jl#==#8512c5aa-077f-4329-9d1f-2b5c66edb74efuncmacro expansionparent_modulefrom_c«plain_error~MethodError: no method matching ExpressionExplorer.ReactiveNode(::String) The type `ExpressionExplorer.ReactiveNode` exists, but no method is defined for this combination of argument types when trying to construct it. Closest candidates are: ExpressionExplorer.ReactiveNode(::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any) @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:14 ExpressionExplorer.ReactiveNode(!Matched::Set{Symbol}, !Matched::Set{Symbol}, !Matched::Set{Symbol}, !Matched::Set{ExpressionExplorer.FunctionNameSignaturePair}, !Matched::Set{Symbol}, !Matched::Set{Symbol}) @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:14 ExpressionExplorer.ReactiveNode(; references, definitions, soft_definitions, funcdefs_with_signatures, funcdefs_without_signatures, macrocalls) @ ExpressionExplorer ~/.julia/packages/ExpressionExplorer/hHz4k/src/ReactiveNode.jl:13 ... Stacktrace: [1] macro expansion @ ~/work/community-call-notes/community-call-notes/2023/04-25/notes.jl#==#8512c5aa-077f-4329-9d1f-2b5c66edb74e:1 [inlined]mime'application/vnd.pluto.stacktrace+objectrootassigneelast_run_timestampAڅC ݰpersist_js_state·has_pluto_hook_features§cell_id$8512c5aa-077f-4329-9d1f-2b5c66edb74edepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$d6bc080c-120a-442b-9574-fce4d33dddacqueued¤logsrunning¦outputbody4

Hint

DEMO PART 1

reactivity

slider

file format

TALK

beknopte geschiedenis van pluto

wat is julia

succes

computationalthinking

foto grant

een slide met 4 unieke manieren waarop pluto wordt gebruikt

reactiviteit

DEMO PART 2

HTML export – recording

Edit or run

Binder (thebe)

TALK 2

reproducibility

activate notebook environment

accessible mission statement

LESSONS FROM THE EXPERIMENT

here at JUPYTERcon, we can look at pluto as an EXPERIMENT, exploration of a specific niche. we hope that some of our ideas and discoveries are transferrable to the jupyterverse!

unique situation

– and the two languages, Julia and JS, are also the languages you use inside notebooks – only modern Julia, modern web browsers supported

– developed alongside teaching computationalthinking

(each has a con as well, which might not be admissable for other projects like jupyter)

lessons

interactivity can be really accessible

people of all coding levels use it and like it

interactivity should be the core! and actually isn't that why we use notebooks?

integration with language's package manager

because we only support one language, and our backend is written in that language, we can have really

(skip) reactivity in Julia requires full control over runtime

because of some Julia syntax features (macros, using import, multiple dispatch), reactivity requires more than just an isolated "topological sort" (

niet zeggen dat het onmogelijk is als jup kernel

easy setup super important

very tempting to make setup more difficult / less reliable (add-ons, powerful features, etc)

Einde

Fons van der Plas work at Julia Lab @ MIT

fonsp

fons@mit.edu

altijd aanspreekbaar mailen bellen

leuk om jup ontwikkelaars te ontmoeten

regular meetings, discord server

plutojl.org/contribute

stickers

Niet genoemd

PlutoSliderServer

PlutoTest time machine

Abstract on the programme

Pluto.jl is a new, open source notebook programming environment for Julia, written in Julia and JavaScript. Our mission is to make Julia more accessible and fun! 🎈

In this talk, we would like to introduce Pluto.jl to the JupyterCon audience, and we will talk specifically about our approach to reproducibility and reactivity. While Pluto.jl is not directly connected to the Jupyter ecosystem, we think that our position (Julia-only, beginners-first) has led to new discoveries and solutions that are exciting to discuss!

Reproducibility 1 – Package Management

We see package management as one of the major hurdles for beginner programmers. It can be intimidating to set up an environment to start programming, but it is especially difficult to set it up in a reproducible way. We want to flip this paradigm: a simple, reproducible environment should be the default, and more advanced users can set up an environment themselves. As a whole, 'scientific computing' has an awful onboarding process, and we scare away so many creative and wonderful people before they are able to contribute. Let's fix that!

One of our goals is to make notebooks reproducible by default. Each notebook file (or HTML export) contains the Manifest.toml file that can be used to exactly recreate the package environment. When you open a Pluto notebook file, the embedded package information is used to automatically recreate the package environment that was used to write it.

A second big feature is automatic package management: instead of a terminal interface, packages are automatically installed and removed as they are used in code. We show package GUI inline in code, and we relay installation progress to the user visually. As a user, it feels like you can simply import any package you want (we even autocomplete all registered package names!), and Pluto takes care of installation and reproducibility.

Reproducibility 2 – Reactivity

Pluto notebooks are reactive, which means that – just like a spreadsheet – your notebook forms a computational graph, and cells re-run automatically when one of their dependencies changes. We also have a "managed scope": we delete variables from scope when the definition disappears.

Reactivity makes Pluto fun and interactive, but it also avoids effects from old code lingering around until a restart. Reactivity and managed scope mean that the notebook is always in its correct state, the same state you would get if you would restart the notebook. At any instant, the notebook state is completely defined by the code you see.

Reproducibility 3 – Binder

Pluto can be installed as a JupyterLab extension, which means that we also run on Binder, the free cloud compute service. We went one step further, and integrated the Binder startup directly into our notebook UI. Inspired by the Thebe project, this allows users to launch a Binder session directly from the website where they are reading a notebook!

Every HTML export file has the original code, and an embedded project environment. But as part of our Binder integration, each HTML file also contains a reference to a version-pinned Binder image, meaning that the exports from Pluto can be re-run in exactly the same environment years into the future.

Lessons and discussion

Pluto is deeply integrated with Julia's package manager, metaprogramming and runtime, something that we were able to freely explore by limiting ourselves to a single language. Originally inspired by Jupyter, which supports more languages and use cases each year, our experiment is to see what happens when we really narrow down our scope: we focus on one language and one audience (Julia newcomers and educators).

We hope to offer an interesting new take on existing topics in the Jupyter ecosystem, and we really look forward to hear what you think!

mimetext/htmlrootassigneelast_run_timestampAڅC Rpersist_js_state·has_pluto_hook_features§cell_id$d6bc080c-120a-442b-9574-fce4d33dddacdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$81015b5f-c415-44a3-aa6c-5d1f541621ebqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅC $Epersist_js_state·has_pluto_hook_features§cell_id$81015b5f-c415-44a3-aa6c-5d1f541621ebdepends_on_disabled_cells§runtime@׽published_object_keysdepends_on_skipped_cells§errored$4aea3e1a-f3ae-42d8-800b-6b28455d6a56queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅB~persist_js_state·has_pluto_hook_features§cell_id$4aea3e1a-f3ae-42d8-800b-6b28455d6a56depends_on_disabled_cells§runtimeյpublished_object_keysdepends_on_skipped_cells§errored±cell_dependencies$8ea7b7f4-e383-11ed-15db-21da2abf4ed8precedence_heuristic cell_id$8ea7b7f4-e383-11ed-15db-21da2abf4ed8downstream_cells_mapupstream_cells_map@md_strgetindex$e4fea5a1-94f4-4e70-80b0-327deaec9369precedence_heuristic cell_id$e4fea5a1-94f4-4e70-80b0-327deaec9369downstream_cells_mapupstream_cells_map@md_strgetindex$a623e733-c47f-470a-85ff-d5649cbf6926precedence_heuristic cell_id$a623e733-c47f-470a-85ff-d5649cbf6926downstream_cells_mapupstream_cells_map@md_strgetindex$9f92a70b-de55-4677-80d8-32d201247235precedence_heuristic cell_id$9f92a70b-de55-4677-80d8-32d201247235downstream_cells_mapupstream_cells_map@md_strgetindex$ecd7f415-1fcf-480f-b522-b05bcd42c4ecprecedence_heuristiccell_id$ecd7f415-1fcf-480f-b522-b05bcd42c4ecdownstream_cells_mapPlutoTeachingToolsupstream_cells_map$8512c5aa-077f-4329-9d1f-2b5c66edb74eprecedence_heuristic cell_id$8512c5aa-077f-4329-9d1f-2b5c66edb74edownstream_cells_mapupstream_cells_mapPluto.ReactiveNodePluto$81015b5f-c415-44a3-aa6c-5d1f541621eb$d6bc080c-120a-442b-9574-fce4d33dddacprecedence_heuristic cell_id$d6bc080c-120a-442b-9574-fce4d33dddacdownstream_cells_mapupstream_cells_map@md_str|>hintgetindex$81015b5f-c415-44a3-aa6c-5d1f541621ebprecedence_heuristic cell_id$81015b5f-c415-44a3-aa6c-5d1f541621ebdownstream_cells_mapPluto$8512c5aa-077f-4329-9d1f-2b5c66edb74eupstream_cells_map$4aea3e1a-f3ae-42d8-800b-6b28455d6a56precedence_heuristic cell_id$4aea3e1a-f3ae-42d8-800b-6b28455d6a56downstream_cells_mapupstream_cells_mapcell_execution_order$ecd7f415-1fcf-480f-b522-b05bcd42c4ec$8ea7b7f4-e383-11ed-15db-21da2abf4ed8$9f92a70b-de55-4677-80d8-32d201247235$d6bc080c-120a-442b-9574-fce4d33dddac$e4fea5a1-94f4-4e70-80b0-327deaec9369$4aea3e1a-f3ae-42d8-800b-6b28455d6a56$a623e733-c47f-470a-85ff-d5649cbf6926$81015b5f-c415-44a3-aa6c-5d1f541621eb$8512c5aa-077f-4329-9d1f-2b5c66edb74elast_hot_reload_timeshortpathnotes.jlprocess_statusreadypathO/home/runner/work/community-call-notes/community-call-notes/2023/04-25/notes.jlpluto_versionv0.20.27last_save_timeAڅBͪcell_order$8ea7b7f4-e383-11ed-15db-21da2abf4ed8$ecd7f415-1fcf-480f-b522-b05bcd42c4ec$9f92a70b-de55-4677-80d8-32d201247235$d6bc080c-120a-442b-9574-fce4d33dddac$e4fea5a1-94f4-4e70-80b0-327deaec9369$4aea3e1a-f3ae-42d8-800b-6b28455d6a56$a623e733-c47f-470a-85ff-d5649cbf6926$81015b5f-c415-44a3-aa6c-5d1f541621eb$8512c5aa-077f-4329-9d1f-2b5c66edb74epublished_objectsnbpkginstall_time_ns 3instantiatedòinstalled_versions!__internal_julia_manifest_version1.12.6__internal_julia_version1.12.6Pluto0.20.27PlutoTeachingTools0.2.15terminal_outputsnbpkg_synci Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Updating registries and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... === ┌ Warning: Pkg operation failed. Loosening compatibility bounds and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Installed PlutoUI ─ v0.7.82  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Project.toml` [c3e4b0f8] + Pluto v0.20.27 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Manifest.toml` [6e696c72] + AbstractPlutoDingetjes v1.4.0 [d1d4a3ce] + BitFlags v0.1.9 [da1fd8a2] + CodeTracking v3.0.2 [944b1d66] + CodecZlib v0.7.8 [3da002f7] + ColorTypes v0.12.1 [34da2185] + Compat v4.18.1 [807dbc54] + Compiler v0.1.1 [f0e56b4a] + ConcurrentUtilities v2.5.1 [5218b696] + Configurations v0.17.6 [9a962f9c] + DataAPI v1.16.0 [e2d170a0] + DataValueInterfaces v1.0.0 [460bff9d] + ExceptionUnwrapping v0.1.11 [21656369] + ExpressionExplorer v1.1.4 [55351af7] + ExproniconLite v0.10.14 [53c48c17] + FixedPointNumbers v0.8.5 [1fa38f19] + Format v1.3.7 [828d9ff0] + GracefulPkg v2.4.3 [cd3eb016] + HTTP v1.11.0 [47d2ed2b] + Hyperscript v0.0.5 ⌅ [ac1192a8] + HypertextLiteral v0.9.5 [b5f81e59] + IOCapture v1.0.0 [82899510] + IteratorInterfaceExtensions v1.0.0 [692b3bcd] + JLLWrappers v1.8.0 [aa1ae85d] + JuliaInterpreter v0.10.12 [8ac3fa9e] + LRUCache v1.6.2 [b964fa9f] + LaTeXStrings v1.4.0 [23fbe1c1] + Latexify v0.16.10 [0e77f7df] + LazilyInitializedFields v1.3.0 [e6f89c97] + LoggingExtras v1.2.0 [6f1432cf] + LoweredCodeUtils v3.5.1 [6c6e2e6c] + MIMEs v1.1.0 [1914dd2f] + MacroTools v0.5.16 [36869731] + Malt v1.4.1 [739be429] + MbedTLS v1.1.10 [99f44e22] + MsgPack v1.2.1 [4d8831e6] + OpenSSL v1.6.1 [bac558e1] + OrderedCollections v1.8.1 [c3e4b0f8] + Pluto v0.20.27 [72656b73] + PlutoDependencyExplorer v1.2.2 [0ff47ea0] + PlutoHooks v0.1.0 [0ff47ea0] + PlutoLinks v0.1.8 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15 [7f904dfe] + PlutoUI v0.7.82 [91cefc8d] + PrecompileSignatures v3.0.3 [aea7be01] + PrecompileTools v1.3.4 [21216c6a] + Preferences v1.5.2 [189a3867] + Reexport v1.2.2 [2792f1a3] + RegistryInstances v0.1.0 [05181044] + RelocatableFolders v1.0.1 [ae029012] + Requires v1.3.1 [295af30f] + Revise v3.14.3 [6c6a2e73] + Scratch v1.3.0 [777ac1f9] + SimpleBufferStream v1.2.0 [10745b16] + Statistics v1.11.1 [3783bdb8] + TableTraits v1.0.1 [bd369af6] + Tables v1.12.1 [3bb67fe8] + TranscodingStreams v0.11.3 [410a4b4d] + Tricks v0.1.13 [5c2747f8] + URIs v1.6.1 [61579ee1] + Ghostscript_jll v9.55.1+0 [aacddb02] + JpegTurbo_jll v3.1.5+0 [c8ffd9c3] + MbedTLS_jll v2.28.1010+0 [0dad84c5] + ArgTools v1.1.2 [56f22d72] + Artifacts v1.11.0 [2a0f44e3] + Base64 v1.11.0 [ade2ca70] + Dates v1.11.0 [8ba89e20] + Distributed v1.11.0 [f43a241f] + Downloads v1.7.0 [7b1f6079] + FileWatching v1.11.0 [b77e0a4c] + InteractiveUtils v1.11.0 [ac6e5ff7] + JuliaSyntaxHighlighting v1.12.0 [b27032c2] + LibCURL v0.6.4 [76f85450] + LibGit2 v1.11.0 [8f399da3] + Libdl v1.11.0 [37e2e46d] + LinearAlgebra v1.12.0 [56ddb016] + Logging v1.11.0 [d6f4376e] + Markdown v1.11.0 [ca575930] + NetworkOptions v1.3.0 [44cfe95a] + Pkg v1.12.1 [de0858da] + Printf v1.11.0 [3fa0cd96] + REPL v1.11.0 [9a3f8284] + Random v1.11.0 [ea8e919c] + SHA v0.7.0 [9e88b42a] + Serialization v1.11.0 [6462fe0b] + Sockets v1.11.0 [f489334b] + StyledStrings v1.11.0 [fa267f1f] + TOML v1.0.3 [a4e569a6] + Tar v1.10.0 [8dfed614] + Test v1.11.0 [cf7118a7] + UUIDs v1.11.0 [4ec0a83e] + Unicode v1.11.0 [e66e0078] + CompilerSupportLibraries_jll v1.3.0+1 [deac9b47] + LibCURL_jll v8.15.0+0 [e37daf67] + LibGit2_jll v1.9.0+0 [29816b5a] + LibSSH2_jll v1.11.3+1 [14a3606d] + MozillaCACerts_jll v2025.11.4 [4536629a] + OpenBLAS_jll v0.3.29+0 [458c3c95] + OpenSSL_jll v3.5.4+0 [83775a58] + Zlib_jll v1.3.1+2 [8e850b90] + libblastrampoline_jll v5.15.0+0 [8e850ede] + nghttp2_jll v1.64.0+1 [3f19e933] + p7zip_jll v17.7.0+0  Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m` Instantiating... === Precompiling... === Plutoi Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Updating registries and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... === ┌ Warning: Pkg operation failed. Loosening compatibility bounds and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Installed PlutoUI ─ v0.7.82  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Project.toml` [c3e4b0f8] + Pluto v0.20.27 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Manifest.toml` [6e696c72] + AbstractPlutoDingetjes v1.4.0 [d1d4a3ce] + BitFlags v0.1.9 [da1fd8a2] + CodeTracking v3.0.2 [944b1d66] + CodecZlib v0.7.8 [3da002f7] + ColorTypes v0.12.1 [34da2185] + Compat v4.18.1 [807dbc54] + Compiler v0.1.1 [f0e56b4a] + ConcurrentUtilities v2.5.1 [5218b696] + Configurations v0.17.6 [9a962f9c] + DataAPI v1.16.0 [e2d170a0] + DataValueInterfaces v1.0.0 [460bff9d] + ExceptionUnwrapping v0.1.11 [21656369] + ExpressionExplorer v1.1.4 [55351af7] + ExproniconLite v0.10.14 [53c48c17] + FixedPointNumbers v0.8.5 [1fa38f19] + Format v1.3.7 [828d9ff0] + GracefulPkg v2.4.3 [cd3eb016] + HTTP v1.11.0 [47d2ed2b] + Hyperscript v0.0.5 ⌅ [ac1192a8] + HypertextLiteral v0.9.5 [b5f81e59] + IOCapture v1.0.0 [82899510] + IteratorInterfaceExtensions v1.0.0 [692b3bcd] + JLLWrappers v1.8.0 [aa1ae85d] + JuliaInterpreter v0.10.12 [8ac3fa9e] + LRUCache v1.6.2 [b964fa9f] + LaTeXStrings v1.4.0 [23fbe1c1] + Latexify v0.16.10 [0e77f7df] + LazilyInitializedFields v1.3.0 [e6f89c97] + LoggingExtras v1.2.0 [6f1432cf] + LoweredCodeUtils v3.5.1 [6c6e2e6c] + MIMEs v1.1.0 [1914dd2f] + MacroTools v0.5.16 [36869731] + Malt v1.4.1 [739be429] + MbedTLS v1.1.10 [99f44e22] + MsgPack v1.2.1 [4d8831e6] + OpenSSL v1.6.1 [bac558e1] + OrderedCollections v1.8.1 [c3e4b0f8] + Pluto v0.20.27 [72656b73] + PlutoDependencyExplorer v1.2.2 [0ff47ea0] + PlutoHooks v0.1.0 [0ff47ea0] + PlutoLinks v0.1.8 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15 [7f904dfe] + PlutoUI v0.7.82 [91cefc8d] + PrecompileSignatures v3.0.3 [aea7be01] + PrecompileTools v1.3.4 [21216c6a] + Preferences v1.5.2 [189a3867] + Reexport v1.2.2 [2792f1a3] + RegistryInstances v0.1.0 [05181044] + RelocatableFolders v1.0.1 [ae029012] + Requires v1.3.1 [295af30f] + Revise v3.14.3 [6c6a2e73] + Scratch v1.3.0 [777ac1f9] + SimpleBufferStream v1.2.0 [10745b16] + Statistics v1.11.1 [3783bdb8] + TableTraits v1.0.1 [bd369af6] + Tables v1.12.1 [3bb67fe8] + TranscodingStreams v0.11.3 [410a4b4d] + Tricks v0.1.13 [5c2747f8] + URIs v1.6.1 [61579ee1] + Ghostscript_jll v9.55.1+0 [aacddb02] + JpegTurbo_jll v3.1.5+0 [c8ffd9c3] + MbedTLS_jll v2.28.1010+0 [0dad84c5] + ArgTools v1.1.2 [56f22d72] + Artifacts v1.11.0 [2a0f44e3] + Base64 v1.11.0 [ade2ca70] + Dates v1.11.0 [8ba89e20] + Distributed v1.11.0 [f43a241f] + Downloads v1.7.0 [7b1f6079] + FileWatching v1.11.0 [b77e0a4c] + InteractiveUtils v1.11.0 [ac6e5ff7] + JuliaSyntaxHighlighting v1.12.0 [b27032c2] + LibCURL v0.6.4 [76f85450] + LibGit2 v1.11.0 [8f399da3] + Libdl v1.11.0 [37e2e46d] + LinearAlgebra v1.12.0 [56ddb016] + Logging v1.11.0 [d6f4376e] + Markdown v1.11.0 [ca575930] + NetworkOptions v1.3.0 [44cfe95a] + Pkg v1.12.1 [de0858da] + Printf v1.11.0 [3fa0cd96] + REPL v1.11.0 [9a3f8284] + Random v1.11.0 [ea8e919c] + SHA v0.7.0 [9e88b42a] + Serialization v1.11.0 [6462fe0b] + Sockets v1.11.0 [f489334b] + StyledStrings v1.11.0 [fa267f1f] + TOML v1.0.3 [a4e569a6] + Tar v1.10.0 [8dfed614] + Test v1.11.0 [cf7118a7] + UUIDs v1.11.0 [4ec0a83e] + Unicode v1.11.0 [e66e0078] + CompilerSupportLibraries_jll v1.3.0+1 [deac9b47] + LibCURL_jll v8.15.0+0 [e37daf67] + LibGit2_jll v1.9.0+0 [29816b5a] + LibSSH2_jll v1.11.3+1 [14a3606d] + MozillaCACerts_jll v2025.11.4 [4536629a] + OpenBLAS_jll v0.3.29+0 [458c3c95] + OpenSSL_jll v3.5.4+0 [83775a58] + Zlib_jll v1.3.1+2 [8e850b90] + libblastrampoline_jll v5.15.0+0 [8e850ede] + nghttp2_jll v1.64.0+1 [3f19e933] + p7zip_jll v17.7.0+0  Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m` Instantiating... === Precompiling... === PlutoTeachingToolsi Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Updating registries and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... === ┌ Warning: Pkg operation failed. Loosening compatibility bounds and trying again... └ @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Installed PlutoUI ─ v0.7.82  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Project.toml` [c3e4b0f8] + Pluto v0.20.27 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_rcnflxtcjf/Manifest.toml` [6e696c72] + AbstractPlutoDingetjes v1.4.0 [d1d4a3ce] + BitFlags v0.1.9 [da1fd8a2] + CodeTracking v3.0.2 [944b1d66] + CodecZlib v0.7.8 [3da002f7] + ColorTypes v0.12.1 [34da2185] + Compat v4.18.1 [807dbc54] + Compiler v0.1.1 [f0e56b4a] + ConcurrentUtilities v2.5.1 [5218b696] + Configurations v0.17.6 [9a962f9c] + DataAPI v1.16.0 [e2d170a0] + DataValueInterfaces v1.0.0 [460bff9d] + ExceptionUnwrapping v0.1.11 [21656369] + ExpressionExplorer v1.1.4 [55351af7] + ExproniconLite v0.10.14 [53c48c17] + FixedPointNumbers v0.8.5 [1fa38f19] + Format v1.3.7 [828d9ff0] + GracefulPkg v2.4.3 [cd3eb016] + HTTP v1.11.0 [47d2ed2b] + Hyperscript v0.0.5 ⌅ [ac1192a8] + HypertextLiteral v0.9.5 [b5f81e59] + IOCapture v1.0.0 [82899510] + IteratorInterfaceExtensions v1.0.0 [692b3bcd] + JLLWrappers v1.8.0 [aa1ae85d] + JuliaInterpreter v0.10.12 [8ac3fa9e] + LRUCache v1.6.2 [b964fa9f] + LaTeXStrings v1.4.0 [23fbe1c1] + Latexify v0.16.10 [0e77f7df] + LazilyInitializedFields v1.3.0 [e6f89c97] + LoggingExtras v1.2.0 [6f1432cf] + LoweredCodeUtils v3.5.1 [6c6e2e6c] + MIMEs v1.1.0 [1914dd2f] + MacroTools v0.5.16 [36869731] + Malt v1.4.1 [739be429] + MbedTLS v1.1.10 [99f44e22] + MsgPack v1.2.1 [4d8831e6] + OpenSSL v1.6.1 [bac558e1] + OrderedCollections v1.8.1 [c3e4b0f8] + Pluto v0.20.27 [72656b73] + PlutoDependencyExplorer v1.2.2 [0ff47ea0] + PlutoHooks v0.1.0 [0ff47ea0] + PlutoLinks v0.1.8 ⌅ [661c6b06] + PlutoTeachingTools v0.2.15 [7f904dfe] + PlutoUI v0.7.82 [91cefc8d] + PrecompileSignatures v3.0.3 [aea7be01] + PrecompileTools v1.3.4 [21216c6a] + Preferences v1.5.2 [189a3867] + Reexport v1.2.2 [2792f1a3] + RegistryInstances v0.1.0 [05181044] + RelocatableFolders v1.0.1 [ae029012] + Requires v1.3.1 [295af30f] + Revise v3.14.3 [6c6a2e73] + Scratch v1.3.0 [777ac1f9] + SimpleBufferStream v1.2.0 [10745b16] + Statistics v1.11.1 [3783bdb8] + TableTraits v1.0.1 [bd369af6] + Tables v1.12.1 [3bb67fe8] + TranscodingStreams v0.11.3 [410a4b4d] + Tricks v0.1.13 [5c2747f8] + URIs v1.6.1 [61579ee1] + Ghostscript_jll v9.55.1+0 [aacddb02] + JpegTurbo_jll v3.1.5+0 [c8ffd9c3] + MbedTLS_jll v2.28.1010+0 [0dad84c5] + ArgTools v1.1.2 [56f22d72] + Artifacts v1.11.0 [2a0f44e3] + Base64 v1.11.0 [ade2ca70] + Dates v1.11.0 [8ba89e20] + Distributed v1.11.0 [f43a241f] + Downloads v1.7.0 [7b1f6079] + FileWatching v1.11.0 [b77e0a4c] + InteractiveUtils v1.11.0 [ac6e5ff7] + JuliaSyntaxHighlighting v1.12.0 [b27032c2] + LibCURL v0.6.4 [76f85450] + LibGit2 v1.11.0 [8f399da3] + Libdl v1.11.0 [37e2e46d] + LinearAlgebra v1.12.0 [56ddb016] + Logging v1.11.0 [d6f4376e] + Markdown v1.11.0 [ca575930] + NetworkOptions v1.3.0 [44cfe95a] + Pkg v1.12.1 [de0858da] + Printf v1.11.0 [3fa0cd96] + REPL v1.11.0 [9a3f8284] + Random v1.11.0 [ea8e919c] + SHA v0.7.0 [9e88b42a] + Serialization v1.11.0 [6462fe0b] + Sockets v1.11.0 [f489334b] + StyledStrings v1.11.0 [fa267f1f] + TOML v1.0.3 [a4e569a6] + Tar v1.10.0 [8dfed614] + Test v1.11.0 [cf7118a7] + UUIDs v1.11.0 [4ec0a83e] + Unicode v1.11.0 [e66e0078] + CompilerSupportLibraries_jll v1.3.0+1 [deac9b47] + LibCURL_jll v8.15.0+0 [e37daf67] + LibGit2_jll v1.9.0+0 [29816b5a] + LibSSH2_jll v1.11.3+1 [14a3606d] + MozillaCACerts_jll v2025.11.4 [4536629a] + OpenBLAS_jll v0.3.29+0 [458c3c95] + OpenSSL_jll v3.5.4+0 [83775a58] + Zlib_jll v1.3.1+2 [8e850b90] + libblastrampoline_jll v5.15.0+0 [8e850ede] + nghttp2_jll v1.64.0+1 [3f19e933] + p7zip_jll v17.7.0+0  Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m` Instantiating... === Precompiling... === enabled÷restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputs$8ea7b7f4-e383-11ed-15db-21da2abf4ed8cell_id$8ea7b7f4-e383-11ed-15db-21da2abf4ed8codeٔmd""" # Weekly notes 25 april 2023 Topics: - Connor is back! yayyy - JupyterCon presentation 11 May! - JuliaSyntax.jl and ExpressionExplorer.jl """metadatashow_logsèdisabled®skip_as_script«code_folded$e4fea5a1-94f4-4e70-80b0-327deaec9369cell_id$e4fea5a1-94f4-4e70-80b0-327deaec9369codemd""" # JuliaSyntax [https://github.com/fonsp/Pluto.jl/pull/2526]() Gave Paul more ideas! Maybe we could us it as part of ExpressionExplorer. - Then we can get the range for each definition, usage, etc - That will be the lezer thing but from Julia Maybe then we don't need scopestate_statefield.js ? But right now we also use it for local changes, i.e. when you type code before you click Shift+Enter. For merging the Operational Transform PR: the dirty cell states will also be shared with the server, so we can add this in that process: for each `:push_changes` (broadcast of local changes), we can also run JuliaSyntax.jl and make the epxressionexplorer result (with ranges) part of the state/update. Then we can do cooler things like renaming a variable across the whole notebook! Because the JS based version that we have right now is not accurate enough. Maybe make a WASM version of just `JuliaSyntax.parse` 😳 We need to still support `Expr` to deal with macro expansions. Maybe this works? ```julia ExpressionExplorer.explore(expr::Expr) = JuliaSytax.parse(string(expr)) ``` If we publish `ExpressionExplorer` then there are lots of cool projects that we can do! Maybe standalone ExpressionExplorer is a bit weird without Pluto's macro handling. """metadatashow_logsèdisabled®skip_as_script«code_folded$a623e733-c47f-470a-85ff-d5649cbf6926cell_id$a623e733-c47f-470a-85ff-d5649cbf6926code>md""" ```julia @reactive begin y = 2 + x x = 1 end ``` """metadatashow_logsèdisabled®skip_as_script«code_folded$9f92a70b-de55-4677-80d8-32d201247235cell_id$9f92a70b-de55-4677-80d8-32d201247235codeGmd""" # JupyterCon! Preparing a talk for JupyterCon! Notes so far: """metadatashow_logsèdisabled®skip_as_script«code_folded$ecd7f415-1fcf-480f-b522-b05bcd42c4eccell_id$ecd7f415-1fcf-480f-b522-b05bcd42c4eccodeusing PlutoTeachingToolsmetadatashow_logsèdisabled®skip_as_script«code_folded$8512c5aa-077f-4329-9d1f-2b5c66edb74ecell_id$8512c5aa-077f-4329-9d1f-2b5c66edb74ecode%Pluto.ReactiveNode("z = y + @show x")metadatashow_logsèdisabled®skip_as_script«code_folded$d6bc080c-120a-442b-9574-fce4d33dddaccell_id$d6bc080c-120a-442b-9574-fce4d33dddaccodemd""" # DEMO PART 1 reactivity slider file format # TALK beknopte geschiedenis van pluto wat is julia - Ju in Jupyter - ## succes computationalthinking foto grant een slide met 4 unieke manieren waarop pluto wordt gebruikt reactiviteit # DEMO PART 2 HTML export – recording Edit or run Binder (thebe) # TALK 2 reproducibility activate notebook environment accessible mission statement # LESSONS FROM THE EXPERIMENT here at JUPYTERcon, we can look at pluto as an EXPERIMENT, exploration of a specific niche. we hope that some of our ideas and discoveries are transferrable to the jupyterverse! ## unique situation - julia only - home-made backend and frontend (e.g. not a jupyter kernel) -- and the two languages, Julia and JS, are also the languages you use inside notebooks -- only modern Julia, modern web browsers supported - focus on julia learners and their teachers -- developed alongside teaching computationalthinking (each has a con as well, which might not be admissable for other projects like jupyter) ## lessons ### interactivity can be really accessible people of all coding levels use it and like it interactivity should be the core! and actually isn't that why we use notebooks? ### integration with language's package manager because we only support one language, and our backend is written in that language, we can have really ### (skip) reactivity in Julia requires full control over runtime because of some Julia syntax features (macros, `using` import, multiple dispatch), reactivity requires more than just an isolated "topological sort" ( niet zeggen dat het onmogelijk is als jup kernel ### easy setup super important very tempting to make setup more difficult / less reliable (add-ons, powerful features, etc) # Einde Fons van der Plas work at Julia Lab @ MIT fonsp fons@mit.edu altijd aanspreekbaar mailen bellen leuk om jup ontwikkelaars te ontmoeten regular meetings, discord server plutojl.org/contribute stickers # Niet genoemd PlutoSliderServer PlutoTest time machine # Abstract on the programme [**Pluto.jl**](https://plutojl.org) is a new, open source notebook programming environment for Julia, written in Julia and JavaScript. Our mission is to make Julia more accessible and fun! 🎈 In this talk, we would like to introduce Pluto.jl to the JupyterCon audience, and we will talk specifically about our approach to **reproducibility** and **reactivity**. While Pluto.jl is not directly connected to the Jupyter ecosystem, we think that our position (Julia-only, beginners-first) has led to new discoveries and solutions that are exciting to discuss! # Reproducibility 1 – Package Management We see package management as one of the major hurdles for beginner programmers. It can be intimidating to set up an environment to start programming, but it is especially difficult to set it up in a *reproducible* way. We want to flip this paradigm: a simple, reproducible environment should be the default, and more advanced users can set up an environment themselves. As a whole, 'scientific computing' has an awful *onboarding* process, and we scare away so many creative and wonderful people before they are able to contribute. Let's fix that! One of our goals is to make notebooks **reproducible by default**. Each notebook file (or HTML export) contains the `Manifest.toml` file that can be used to exactly recreate the package environment. When you open a Pluto notebook file, the embedded package information is used to automatically recreate the package environment that was used to write it. A second big feature is automatic package management: instead of a terminal interface, packages are **automatically installed and removed** as they are used in code. We show package GUI inline in code, and we relay installation progress to the user visually. As a user, it feels like you can simply import any package you want (we even autocomplete all registered package names!), and Pluto takes care of installation and reproducibility. # Reproducibility 2 – Reactivity Pluto notebooks are *reactive*, which means that – just like a spreadsheet – your notebook forms a computational graph, and cells **re-run automatically** when one of their dependencies changes. We also have a "managed scope": we delete variables from scope when the definition disappears. Reactivity makes Pluto fun and interactive, but it also avoids effects from old code lingering around until a restart. Reactivity and managed scope mean that the notebook is always in its correct state, the same state you would get if you would restart the notebook. At any instant, the notebook state is completely defined by the code you see. # Reproducibility 3 – Binder Pluto can be installed as a JupyterLab extension, which means that we also run on [Binder](https://mybinder.org), the free cloud compute service. We went one step further, and integrated the Binder startup directly into our notebook UI. Inspired by [the Thebe project](https://github.com/executablebooks/thebe), this allows users to launch a Binder session directly from the website where they are reading a notebook! Every HTML export file has the original code, and an embedded project environment. But as part of our Binder integration, each HTML file also contains a reference to a version-pinned Binder image, meaning that the exports from Pluto can be re-run in exactly the same environment years into the future. # Lessons and discussion Pluto is deeply integrated with Julia's package manager, metaprogramming and runtime, something that we were able to freely explore by limiting ourselves to a single language. Originally inspired by Jupyter, which supports more languages and use cases each year, our experiment is to see what happens when we really narrow down our scope: we focus on one language and one audience (Julia newcomers and educators). We hope to offer an interesting new take on existing topics in the Jupyter ecosystem, and we really look forward to hear what you think! """ |> hintmetadatashow_logsèdisabled®skip_as_script«code_folded$81015b5f-c415-44a3-aa6c-5d1f541621ebcell_id$81015b5f-c415-44a3-aa6c-5d1f541621ebcodeimport Plutometadatashow_logsèdisabled®skip_as_script«code_folded$4aea3e1a-f3ae-42d8-800b-6b28455d6a56cell_id$4aea3e1a-f3ae-42d8-800b-6b28455d6a56codemetadatashow_logsèdisabled®skip_as_script«code_folded«notebook_id$861fd17a-58ae-11f1-a054-032b693841e4in_temp_dir¨metadata