►
From YouTube: JupyterLab Dev Meeting, February 17, 2017
Description
Meeting of the JupyterLab development team, February 17, 2017
Meeting Notes: https://jupyter.hackpad.com/JupyterLabNotebook-Weekly-Meetings-UUJ3gIQ3iBS
A
A
B
C
So
I've
been
doing
continued
deterioration
on
hierarchical,
collaborative
models,
more
complex
objects
in
particular.
What
I've
found
me
for
is
sort
of
an
intermediate,
an
intermediate
or
object
in
that
a
JSON
representation
to
something
a
bit
them,
and
then
the
full
live
model.
For
me,
like
a
cell
model
or
an
output
area
model,
is
something
that
really
can't
be
serialized
easily
over
the
network.
You
know
for
have
it
having
the
model
and
all
of
its
functions
can't
can't
be
easily
serialized
right.
C
So
what
what
I
need
is
something
that's
more
like
an
intermediate
object,
something
that's
so
each
of
these
things
can
be
seen
a
sort
of
morally
a
map
or
a
list,
or
something
like
that,
and
if
you
want
to
serialize
them
it,
you
have
to
convert
them
into
something
like
a
map
or
a
list.
So
so
the
output
area,
for
instance,
is
a
list
of
thing
or
can
be
seen
as
a
list
of
things
can
be
served
cast
into
a
list
of
things
that
can
be
sent
over
the
network,
and
so
what
I'm?
C
Finding
we
need
is
something
that
knows
is
when
you
register
something
as
being
a
collaborative
object.
You
need
to
provide
some
sort
of
function.
That
knows
how
to
take
it
to
and
from
one
of
these
simpler
data
types,
and
so
I'm
I've
been
playing
with
different
ways
of
exposing
that
API.
But
the
essential
problem
is
if.
C
There
are
several
different
types
with
our
sort
of
which
are
much,
which
are
very
different
from
each
other
that
you
that
we
would
want
to
be
able
to
say
you
can
do
primitive.
You
can
get
an
object
or
you
can
actually
have
things
like
lists
and
max
that
are
that
are
smarter
and
I
want
all
of
these
things
to
work,
which
means
that
unfortunately,
I've
had
a
certain
amount
of
runtime
type
checking
which
are
not
particularly
happy
about
it.
But
I
don't
see
a
way
around
at
the
moment.
C
Collaborative
JSON
object.
You
can't
listen
for
changes
to
various
fields,
it's
just
a
it's
a
dumb,
JSON
blob,
and
so,
if
you
want
something
that
has
a
little
bit
more
and
so
it
is
totally
possible
to
do
the
whole
thing
with
like
the
full
JSON
blob
of
cells.
It's
getting
push
back
and
forth,
but
that's
not
very
granular
and
you
can't
do
sort
of
more
complex
manipulations
on
that
object
for
infants
to
people
can't
edit
the
cell.
A
C
D
D
C
F
One
Steven
I
talk
about
this
when
he
was
doing
this
stuff.
That
he's
been
doing.
One
thing
that
you
might
consider
as
a
pattern
is
the
way
backbone
implements
models
because
they
know
you
have
arbitrary
data,
but
they
want
to
give
it
a
uniform
interface,
so
they
they
give
you
a
get
and
a
set
method
and
you
pass
in
the
key
and
the
values,
but
the
trouble
with
that
is
when
you
go
like
a
level
deeper
or
too
long.
You
know
when
you
have
arbitrarily
complex
sub
structures
like
I
thought.
At
some
point
you
get.
F
B
F
Is
kicked,
no
I
dropped
there
for
a
second
sorry,
okay,
basically,
what
I
was
saying
is
the
backbone
model.
Is
an
attempt
to
sort
of
deal
with
giving
structure
to
these
arbitrary
data
data
objects,
but
it
might
turn
out
to
be
not
what
you
want.
It
might
turn
out
that
at
some
point
you
really
just
the
way
around
it
is
to
create
a
JSON
schema
or
something,
and
not
not
like
give
up
the
idea
of
completely
arbitrary
blobs
of
JSON,
but
I'm
not
I'm
not
sure
fortuitously.
E
D
Just
wanted
I
just
want
to
point
out
that
any
we
should
do
whatever
we
can
to
avoid
a
situation
where
we're
taking
like
arbitrarily
complex
JSON
structures
and
ratifying
each
level
of
the
hierarchy
into
some
separately
observable
object
because
to
handle
then
destined
changes
or
top
level
changes.
You
end
up
with
this
notification
problem
where
you
have
to
like
start
stepping
down
the
hierarchy
and
amid
several
notifications,
based
on
where
you're
at
it
becomes
very
complicated,
I've
been
down
that
path
before
it
killed.
D
This
is
why
I
was
bringing
up
resync
TB,
because
you
have
one
central
manager
of
this
for
charity,
complex
bag
of
stock,
and
you
basically
can
assign
your
listeners
basically
become.
Query
query
listeners.
So
if
anything,
changes
in
that
bag
of
stuff,
the
reaching
PP
figures
out,
which
listeners
match
that
query
and
notify
them
appropriately.
So
it's
a
basically
centralized
notification,
dispatch
versus
hierarchical
dispatch
and,
in
my
experience,
that
hierarchical
dispatch
is
just
fraught
with
peril.
So
we
should
point
out
at
all
costs.
A
Pegasus
also
brings
up
some
of
the
graphing
great
languages
that
have
come
out
as
well
Andy.
How
do
you
see
the
workflow
working
with
your
your
intermediate
object
versus
the
actual
cell
object?
You
see
conversion.
Do
you
see
copying
from
your
enemy?
The
object?
You
see,
the
intermediate
object
forming
the
basis
of
your
cell
model,
and
then
your
cell
models
built
out
built
around
that
or
inherits
from
it
or
something
I.
C
So
the
pattern
that
I
had
sort
of
that
I
had
worked
out
with
steve
was
there?
Are
these
various
observable
objects
and
we
maybe
have
a
real-time
version
of
this,
that
we
link
into
the
back
of
the
one
that
is
in
the
live
model.
So,
for
instance,
there's
the
observable
vector
which
is
which
holds
the
cell
holds
the
cell
models
and
we
could
say
well.
We
can
link
that
to
a
real
time
vector
and
so
that
changes
in
the
real
time
vector
get
passed
on
to
the
vector
of
cells
in
the
upper
right.
C
A
I
have
a
cell
model
and
it's
subscribing
the
changes
from
this
intermediate
cell
data
representation.
This
is
data
model,
real
time
data
model
or
whatever,
and
ok
and
there's
real
time
data
model,
those
separately
from
the
cell
model.
It's
getting
notifications
through,
however,
is
that
things
are
changing
or
it's
changing
itself
sending
out
notifications,
and
then
the
cell
is
listening
to
the
corresponding
cells.
Listening
to
these
changes
and
and
copying
over
the
new
text,
you
know
modifying
the
actual
cell
model,
that's
being
used
for
vendor,
based
on
notifications
to
the
real-time
data
model,
so.
C
C
A
A
A
A
I
think
is
any
other
comments
or
feedback
for
you
or
anything
else.
You
need
to
say
those.
C
The
restore
the
application
restore
functionality
has
hard-coded
in
which
makes
sense
has
work
hard
coded
in
was
trying
to
reopen
a
widget.
It
will
try
to
reopen
the
same
files
in
it
and
goes
to
the
five.
The
you
know
the
file
browser
plugin
to
try
to
reopen
that
file.
This
has
been
problematic
if
you
have
more
than
one
file
browser
mounted,
as
I
do
stuff
that
I've
been
working
on.
C
F
So,
actually,
that's
a
that's
a
problem
across
the
board
because
it's
not
actually
using
the
file
browser,
necessarily
it's
using
a
command
that
the
all
browsers
are
registered,
so
there's
lots
of
other
things
that
use
the
same
command
and
it's
the
file
operations,
colon,
open
command
and
and
that's
actually
used
across
the
board.
So
if
you
have
more
than
one
file
browser,
you
need
to
either.
F
Meet
a
command
that
takes
into
account
that
there
might
be
multiple
file
browsers,
maybe
there's
some
sort
of
manager
or
something
like
that,
and
basically
delegates
to
the
correct
file
browser
or
we
need
to.
We
need
to
have
a
different
strategy,
but
basically
a
restore
can
only
run
a
command.
So
it's
our
job
to
make
sure
the
command
is
capable
of
doing
the
right
thing,
but
the
solution
isn't
exactly
obvious,
but
it's
not
specific
to
the
file
browser.
It's
just
that
whatever
command
we
invoke
has
to
be
flexible
enough
to
deal
with
it.
F
If
this
is
the
point
that
you're
stuck
out
right
now,
we
can
talk
it
through
together,
maybe
next
week
and
try
to
resolve
it.
I'm
going
to
block
it.
Okay,
okay,
but
yeah
I
mean
basically
it
if
it
turns
out
that
we're
going
to
have
multiple
file
browsers
on
the
page,
then
and
they're
going
to
be
dealing
with
different
sources,
and
we
need
a
solution
to
this
problem
in
general.
F
If
it
turns
out
that
you
have
a
special
case-
and
it's
always
going
to
be
a
3rd
party
plugins-
that
as
the
second
file
browser,
then
it's
got
to
be
the
responsibility
of
the
third
party
plugin
to
blow
away
the
old
come
in
and
create
a
new
command
that
does
all
the
work
is
supposed
to
yeah
wait.
Do
we
have
a
wave
long
way
old
commands
right
now,
like
if
you're,
not
the
person
who
registered
file
operations,
colon
open,
you
don't
have
that
disposable
or
anything?
F
D
F
A
D
The
whole
the
whole
point
of
command
is
for
hooking
up
key
bindings
and
menu
items
and
command
palette
stuff
that
should
more
or
less
be
decoupled.
From
the
thing
that's
doing
the
action,
but
not
decoupled,
in
a
way
that
it's
going
to
be
like
swappable
at
at
runtime
like
like
tokens,
are,
and
the
dependency
injection
system
and
the
reason
for
that.
D
It
is
done
that
way
explicitly
to
discourage
people
from
making
api's
that
are
entirely
on
typesafe
really
used
to
commit,
because
we
allow
overriding
command
anybody's
going
to
come
in
there
and
just
start
swapping
out,
commands
the
building,
an
API
and
we're
all
commanders,
and
usually
there
are
better
ways
to
express
that
pattern.
Like
Coach
D,
just
suggested
by
passing
around
bottles
instead
of
just
saying:
oh
just
call
this
command
and
then
I
might
replace
it.
I
might
not,
but.
F
We
were
going
to
run
into
situations
where
things
not
just
in
a
store,
but
the
restore
is
a
good
example,
but
also
things
like
the
command
linker,
where
you
have
a
file
name
in
a
document,
and
you
want
to
link
it
to
command.
That's
going
to
open
the
file
name,
we're
going
to
have
these
things
that
call
utility
commands
right
and
those
utility
commands
that
open
things
in
Ian's
case
open
means
something
different
than
in
the
unmodified
Jupiter
lab
case
in
the
unmodified
Jupiter
lab
case.
E
Remember
that
can
always
that
there's
two
sources:
there
should
be
one
source
at
Ian's
own
that
may
slave
to
the
non
real-time
foul
model
for
some
things
in
his
own
for
others.
But
this
is
still
as
far
as
as
far
as
everything
else
is
concerned,
there
should
be
an
abstract
model.
Redis
if
you
like,
okay,.
F
E
E
As
a
token,
the
file
browser
ma
plugin
will
take
that
model
as
a
token,
and
so
if
ian
wants
to
replace
that,
that
plug-in
was
a
real-time
aware
plugin,
then
he
can
instantiate
both
real-time
browser
model
and
a
non
real-time
file
browser
model
and
exposed
while
exposed
one
thing
that
that
either
he
does
is
a
real
time
or
not.
Episode
like
like
it's
an
enhanced
file
browser
model
that
implements
that
interface,
because.
C
F
You
connect
two
separate
servers,
so
you
have
two
different
file
browsers.
One
is
for
your
local
server
ones
for
the
foreign
server
and
you
still
want
to
be
able
to
double
click
on
a
file
and
open
it,
and
when
you
double
click
on
a
file,
it's
calling
foul
operations
open.
Let's
say
how
do
we
implement
that
without
then
we
have
a
different
problem
because.
E
Basically,
our
current
file
browser
model
is
a
current
working
directory
model.
So
if
you
want
to
have
multiple
current
working
directory
in
the
application,
then
yeah
Ian's
right,
you
have
to
resync
what
we're
doing
here
where
each
of
those
is
an
independent
like
what
is
there
Connor
there?
There
should
be
a
current
working
directory
of
cupid
lab,
but
you
might
want
a
different
file
browser
to
be
in
a
different
working
directory.
F
Okay,
actually,
that
that,
while
that
sounds
like
an
issue,
I
think
it's
a
sort
of
a
different
issue,
because
none
of
the
none
of
the
restorations
care
about
your
current
working
directory.
They
just
give
a
path
to
open,
irrespective
of
where
the
file
browser.
Currently
is
it's
just
the
idea
of
how
do
you
open
files
that
come
from
multiple
sources
with
one
command,
but.
E
F
Now
you
can
change
a
shortcut
to
it
and
you
don't
have
to
worry
about
the
single
character
restriction
that
I
had
last
week
and
the
tooltip
and
the
inspector
all
had
the
same
pattern
and
it's
just
it's
cleaner
and
nicer
before
it's
one
side
effect
of
this
fork
was
that
we
came
to
the
conclusion
that
all
shortcuts
need
to
be
captured
on.
The
sorry
need
to
be
listened
to
on
the
capture
page,
which
is
how
we
originally
were
doing
it.
But
then
we
switch
the
bubble,
and
now
we've
switched
back.
F
It
shouldn't
really
affect
anyone,
but
it
is
a
thing
to
note
it
might
affect
you
if
you
want
to
add
a
shortcut
to
say
the
notebook,
and
you
want
that
shortcut
to
only
work
in
edit
mode.
You'll
notice
that
now
the
selectors
for
that
all,
have
a
focus
pseudo
selector,
so
that
things
that
take
away
the
focus
from
the
cell
you're
editing,
but
aren't
truly
edit
mode
like
when
you
use
input,
and
you
have
a
little
form
element
that
you're
putting
values
in
those
things
are
not
fire
edit
command
mode
shortcuts.
F
A
A
A
E
I'm,
a
4590
are
that
so
essentially
rewrites
the
render
mine
and
output
area
models.
What
prompted
it
was
that
we
wanted
more
interactivity
on
what
they
render
received
and
that
it
can
interact
with
the
data
and
the
metadata
and
other
renders
that
have
have
the
same
view
of
that
model
can
respond
accordingly,
including
the
the
cell
model
itself.
So
Ian
committed
the
observable
map
and
I
just
ran
with
that,
and
the
thread
unfortunately
kept
pulling
and
pulling
and
McCoys
honored
lines
later.
E
Everything
is
a
lot
cleaner,
I
think
the
biggest
thing
is
the
output
area
I'm.
Sorry,
an
individual
output
model
can
now
be
expressed
as
just
a
a
rendered.
My
model
that
is
using
MV
format
data,
so
I've
actually
moved
that
2
2,
the
runner
mine
folder
as
the
output
model
is
there.
So
it's
a
couple
from
the
output
area
is
a
separate
thing
that
only
uses
sandy
format
interfaces,
and
so
you
get
a
live
data
model
for
the
outport
Emmy,
the
widget.
E
We're
also
amenable
to
this
observable
map,
as
so
those
are
converted
over,
and
so
the
cell
data
tools
metadata
editor
now
uses
that,
instead
of
this,
instead
of
a
role
model
of
having
the
cursors
associated
with
circuit,
you
can
just
feed
it
directly
that
metadata
that
live,
JSON
observable
and
you
can
interact
with
it.
So
that's
that's
more
more
widely
usable
on
that
sense,
and
also
there
was
some,
unfortunately,
in
the
output
area
model
as
it
stood
before
it
had.
E
That
was
never
to
put
two
discs
and,
in
general,
just
took
that
opportunity
to
clean
up
the
render
mine
and
output
area
of
models
thought
about
how
I've
previously
gone
through
the
widget
hierarchy
to
make
those
use
the
same
patterns
and
a
lot
of
ifs.
What
that?
How
do
we
look
like
on
the
model
side?
E
But
but
it's
a
fairly
moving
things
to
the
random
on
the
output
area.
The
output
model
to
the
render
mine,
giving
the
renders
a
live
data
model
will
satisfy
things
like
I'll
tear
that
want
to
dynamically.
Add
PGL
court.
Some
or
you
know
it
just
in
general,
modify
their
existing
the
mind
model.
So
the
render
mine
that
was
selected
to
be
rendered
has
has
full
capability
to
interact
with
the
mine
bundle
was
given
and.
E
Was
this
thing
called
is
sanitized
bull
is
safe,
but
instead
now
trusted.
As
part
of
you
always
know
whether
the
model
is
trusted
as
part
of
the
model,
and
it's
read
only
at
the
random
level
and
you
always
get
a
sanitizer.
We
have
a
default
sanitizing,
the
app,
if
you
don't
override
it,
Brenda
mom
will
give
you
one.
So
you've
always
got
a
sanitizer
and
you
always
know
whether
the
output
is
trusted.
E
You
know
it
knows
there
will
be
a
sanitizer
and
based
on
whether
the
model
is
trusted,
they
can
decide
whether
it
can
render
or
not
so
the
render
mine
will
go
through
and
preferred
order
and
find
the
one
that
can
render
and
select
that
so
in
your
case,
I've
had
widgets.
If
it
was
no
Colonel,
you
could
reject
that
and
then
it
would
find
the
next
one.
So
that
satisfies
that.
E
E
D
Yeah,
so
a
commission
on
the
package,
refactoring
everything's
been
merged
in
the
master
and
I'm
actually
doing
releases
now.
So
these
this
is
100
level
code
I'm,
releasing
it
right
now
as
010
just
in
case
I've
made
some
mistakes,
and
so
we
actually
have
full
test
coverage,
but
for
people
I
want
to
actually
install
and
start
living
on
the
new
stuff,
which
will
be
10
no
code.
You
can
go
in
and
start
installing.
Those
I
haven't
pushed
all
the
packages,
not
yet
I'm
doing
that
now.
D
But
all
of
this
is
under
a
namespace
package,
so
this
would
be
at
phosphorus
flash
whatever
package
you
want,
it
didn't
make
an
org
for
this.
Actually
I
made
a
new
user
on
NPM
in
order
to
get
the
name
spacing
stuff
because
works
costs
fourteen
dollars
a
month
per
user.
It's
not
cheap,
but
yeah.
So
so
that's
it!
So
all
the
stuffs
coming
up
now
and
we
just
start
doing
it
I
know
then
30
minutes
after
I've
done
for
my
family.
D
A
D
A
E
We're
going
to
do
this
in
phases.
First
would
be
to
anything
widget
or
signal.
Related
we've
poured
over
first
and
then
things
like
a
vector
is
no
longer
that's
been
replaced
by
the
array
extended
interface,
so
we
go
through
dunno
pass
with
that
and
then
we'd
also.
The
next
step
is
to
create
the
individual
Jupiter
lab
packages
in
preparation
for
I
mean
the
reason
for
doing
it
with
foster
was
to
make
it
more
composable
and
amenable
to
plug
in
use.
E
D
E
A
A
D
Not
what
it
says
it's
all
I
can
get
a
promise
fact
that
will
resolve
it
and
when
that
thing
becomes
available,
because
that
would
require
lots
of
transitive
computation.
So
every
time
you
would
add,
saying
or
kind
of
search
through
that
entire
transitive
graph
of
the
thing
that
you
added
the
determines
whether
it
resolves
if
I
fun,
so
the
invasion
becomes
a
really
difficult
problem
to
do
what
you're
describing.
D
Mean
they're
there
for
the
resolving
that's
like.
If
you
wanted
a
method
than
to
say
I
want
you,
I
want
to
promise
them
going
to
resolve
whenever
this
thing
can
finally
be
fulfilled.
Whenever
that
may
be,
that's
it.
That's
a
much
more
difficult
problem
that
we
have.
What
we
have
now
is
be
saying:
hey
if
that
application
startup
time
after
all
of
the
startup
plugins
have
been
registered.
If
you
think
fulfill
this,
give
it
to
me,
that's
a
much
easier
self
and
that's.