Bokeh-server and firewalls

Say I want to run Bokeh on a server with a firework that is blocking most ports (the server is internet exposed, and it only allows for ssh/HTTP and a few other ports). That said, I can start processes in the machine listening to any ports through localhost.

Is there a way to set up Bokeh so that the browser (on the network) talks to the web server on port=80 and the web-server talks to the bokeh-server (within the server) through localhost?

In other words, rather than:

client <–network address:port=80 → bokeh-server

Have it as:

client <–network address:port=80 → web-server <–localhost:port=whatever–> bokeh-server

Thanks,

Josh

To clarify, I am not looking for a solution that assumes that the plots can be pre-computed I am using the server to refresh data based on the input (i.e. I rely on Python scripts to query data from an API and a SQL database depending on inputs on various widgets).

Josh

···

On Thu, Aug 28, 2014 at 12:02 AM, Josh Wasserstein [email protected] wrote:

Say I want to run Bokeh on a server with a firework that is blocking most ports (the server is internet exposed, and it only allows for ssh/HTTP and a few other ports). That said, I can start processes in the machine listening to any ports through localhost.

Is there a way to set up Bokeh so that the browser (on the network) talks to the web server on port=80 and the web-server talks to the bokeh-server (within the server) through localhost?

In other words, rather than:

client <–network address:port=80 → bokeh-server

Have it as:

client <–network address:port=80 → web-server <–localhost:port=whatever–> bokeh-server

Thanks,

Josh

Sure - so the only issue, is that since we’re now (in master)
running the bokeh server on 2 ports (one for regular http, and one
for websockets) you need 2 ports.

Here is a sample configuration I've recently deployed, runs 4 bokeh

server instances, and 2 websocket instances

(haproxy configuration)

(supervisord confugration, so you can see the command line options

that are being used)
If you’re running 0.5.2, then this is much simpler, since we’re
using gevent, and everything runs on one port -for that you could
just run the bokeh server and port 80, but you would need to run it
as root since port 80 needs root access to serve on. But you should
be ready for the 2 port configuration since that’s what is going to
be used going forwards.

···

https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg

https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf

  On 08/28/2014 12:11 AM, Josh

Wasserstein wrote:

    To clarify, I am not looking for a solution that

assumes that the plots can be pre-computed I am using the server
to refresh data based on the input (i.e. I rely on Python
scripts to query data from an API and
a SQL database depending on inputs on various widgets).

Josh

      On Thu, Aug 28, 2014 at 12:02 AM, Josh

Wasserstein [email protected]
wrote:

          Say I want to run Bokeh on a server with a

firework that is blocking most ports (the server is
internet exposed, and it only allows for ssh/HTTP and a
few other ports). That said, I can start processes in the
machine listening to any ports through localhost.

Is there a way to set up Bokeh so that the browser (on
the network) talks to the web server on port=80
and the web-server talks to the bokeh-server (within
the server) through localhost?

In other words, rather than:

client <–network address:port=80 →
bokeh-server

Have it as:

client <–network address:port=80 →
web-server <–localhost:port=whatever–>
bokeh-server

Thanks,

Josh

  You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

  To unsubscribe from this group and stop receiving emails from it,

send an email to [email protected].

  To post to this group, send email to [email protected].

  To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer).

  For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

Thanks Hugo. We are using Bokeh 0.5.2+ (dev builds). I am not sure I understand everything in your email.

When you said:

If you’re running 0.5.2, then this is much simpler, since we’re using gevent, and everything runs on one port -for that you could just run the bokeh server and port 80, but you would need to run it as root since port 80 needs root access to serve on.

the problem we have is that 80 is already used by a regular web server and we would like to expose other ports to the network. Is the following setup possible?

  • The client (browser on machine A) connects to web server (machine B:80).

  • The web server (machine B:80) processes the request and talks to Bokeh server through localhost (listening on machine B:some other port) to render data, and serve it (through machine B:80) to machine A.

This way we do not have to expose machine B: to the network. Instead, the web server talks to the Bokeh server through localhost.

Josh

···

On Thu, Aug 28, 2014 at 1:09 PM, Hugo Shi [email protected] wrote:

Sure - so the only issue, is that since we're now (in master)

running the bokeh server on 2 ports (one for regular http, and one
for websockets) you need 2 ports.

Here is a sample configuration I've recently deployed, runs 4 bokeh

server instances, and 2 websocket instances

(haproxy configuration)

https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg

(supervisord confugration, so you can see the command line options

that are being used)

https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf

If you're running 0.5.2, then this is much simpler, since we're

using gevent, and everything runs on one port -for that you could
just run the bokeh server and port 80, but you would need to run it
as root since port 80 needs root access to serve on. But you should
be ready for the 2 port configuration since that’s what is going to
be used going forwards.

  On 08/28/2014 12:11 AM, Josh

Wasserstein wrote:

    To clarify, I am not looking for a solution that

assumes that the plots can be pre-computed I am using the server
to refresh data based on the input (i.e. I rely on Python
scripts to query data from an API and
a SQL database depending on inputs on various widgets).

Josh

  --

  You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

  To unsubscribe from this group and stop receiving emails from it,

send an email to [email protected].

  To post to this group, send email to [email protected].

  To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer).



  For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

You received this message because you are subscribed to the Google Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].

To post to this group, send email to [email protected].

To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.

      On Thu, Aug 28, 2014 at 12:02 AM, Josh

Wasserstein [email protected]
wrote:

          Say I want to run Bokeh on a server with a

firework that is blocking most ports (the server is
internet exposed, and it only allows for ssh/HTTP and a
few other ports). That said, I can start processes in the
machine listening to any ports through localhost.

Is there a way to set up Bokeh so that the browser (on
the network) talks to the web server on port=80
and the web-server talks to the bokeh-server (within
the server) through localhost?

In other words, rather than:

client <–network address:port=80 →
bokeh-server

Have it as:

client <–network address:port=80 →
web-server <–localhost:port=whatever–>
bokeh-server

Thanks,

Josh

Sorry - I misunderstood.

Yes it is possible, however your webserver needs to be capable of doing http forwarding as well as websocket forwarding. I think nginx is capable of doing this, though in my limited experience, the websocket forwarding i got from nginx was a bit unreliable.

···

On Thu 28 Aug 2014 05:14:46 PM EDT, Josh Wasserstein wrote:

Thanks Hugo. We are using Bokeh 0.5.2+ (dev builds). I am not sure I
understand everything in your email.

When you said:
/If you're running 0.5.2, then this is much simpler, since we're using
gevent, and everything runs on one port -for that you could just run
the bokeh server and port 80, but you would need to run it as root
since port 80 needs root access to serve on.
/

the problem we have is that 80 is *already used* by a regular web
server and we would like to expose other ports to the network. Is the
following setup possible?

- The client (browser on machine A) connects to web server (machine B:80).
- The web server (*machine B:80*) processes the request and talks to
Bokeh server _through localhost_ (listening on *machine B*:*some other
port*) to render data, and serve it (through *machine B:80*) to machine A.

This way we do not have to expose *machine B*:<some other port> *to
the network. *Instead, the web server talks to the Bokeh server
through localhost.

Josh

On Thu, Aug 28, 2014 at 1:09 PM, Hugo Shi <[email protected] > <mailto:[email protected]>> wrote:

    Sure - so the only issue, is that since we're now (in master)
    running the bokeh server on 2 ports (one for regular http, and one
    for websockets) you need 2 ports.

    Here is a sample configuration I've recently deployed, runs 4
    bokeh server instances, and 2 websocket instances

    (haproxy configuration)

    https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg

    (supervisord confugration, so you can see the command line options
    that are being used)

    https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf

    If you're running 0.5.2, then this is much simpler, since we're
    using gevent, and everything runs on one port -for that you could
    just run the bokeh server and port 80, but you would need to run
    it as root since port 80 needs root access to serve on. But you
    should be ready for the 2 port configuration since that's what is
    going to be used going forwards.

    On 08/28/2014 12:11 AM, Josh Wasserstein wrote:

    To clarify, I am not looking for a solution that assumes that the
    plots can be pre-computed I am using the server to refresh data
    based on the input (i.e. I rely on Python scripts to query data
    from an API <http://docs.python-requests.org/en/latest/&gt; and a
    SQL database depending on inputs on various widgets).

    Josh

    On Thu, Aug 28, 2014 at 12:02 AM, Josh Wasserstein >> <[email protected] <mailto:[email protected]>> wrote:

        Say I want to run Bokeh on a server with a firework that is
        blocking most ports (the server is internet exposed, and it
        only allows for ssh/HTTP and a few other ports). That said, I
        can start processes in the machine listening to any ports
        through localhost.

        Is there a way to set up Bokeh so that the *browser* (on the
        network) talks to the *web server* on port=80 and the
        *web-server* talks to the *bokeh-server* (within the server)
        through localhost?

        In other words, rather than:
        *client* <--network address:port=80 --> *bokeh-server*

        Have it as:
        *client* <--network address:port=80 --> *web-server*
        <--localhost:port=whatever--> *bokeh-server*
        *
        Thanks,

        Josh
        *

    --
    You received this message because you are subscribed to the
    Google Groups "Bokeh Discussion - Public" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected]
    <mailto:[email protected]>.
    To post to this group, send email to [email protected]
    <mailto:[email protected]>.
    To view this discussion on the web visit
    https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com
    <https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer&gt;\.
    For more options, visit
    https://groups.google.com/a/continuum.io/d/optout\.

    --
    You received this message because you are subscribed to the Google
    Groups "Bokeh Discussion - Public" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected]
    <mailto:[email protected]>.
    To post to this group, send email to [email protected]
    <mailto:[email protected]>.
    To view this discussion on the web visit
    https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com
    <https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com?utm_medium=email&utm_source=footer&gt;\.
    For more options, visit
    https://groups.google.com/a/continuum.io/d/optout\.

--
You received this message because you are subscribed to the Google
Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com
<https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com?utm_medium=email&utm_source=footer&gt;\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

Can you elaborate more on this? Can you provide an example of what software and configuration you would use to do this? Is it possible to use a python simple http server?

···

On Thursday, August 28, 2014 at 2:16:33 PM UTC-7, Hugo Shi wrote:

Sorry - I misunderstood.

Yes it is possible, however your webserver needs to be capable of doing
http forwarding as well as websocket forwarding. I think nginx is
capable of doing this, though in my limited experience, the websocket
forwarding i got from nginx was a bit unreliable.

On Thu 28 Aug 2014 05:14:46 PM EDT, Josh Wasserstein wrote:

Thanks Hugo. We are using Bokeh 0.5.2+ (dev builds). I am not sure I

understand everything in your email.

When you said:

/If you’re running 0.5.2, then this is much simpler, since we’re using

gevent, and everything runs on one port -for that you could just run

the bokeh server and port 80, but you would need to run it as root

since port 80 needs root access to serve on.

/

the problem we have is that 80 is already used by a regular web

server and we would like to expose other ports to the network. Is the

following setup possible?

  • The client (browser on machine A) connects to web server (machine B:80).
  • The web server (machine B:80) processes the request and talks to

Bokeh server through localhost (listening on machine B:*some other

port*) to render data, and serve it (through machine B:80) to machine A.

This way we do not have to expose machine B: *to

the network. *Instead, the web server talks to the Bokeh server

through localhost.

Josh

On Thu, Aug 28, 2014 at 1:09 PM, Hugo Shi <[email protected] > > > mailto:[email protected]> wrote:

Sure - so the only issue, is that since we're now (in master)
running the bokeh server on 2 ports (one for regular http, and one
for websockets) you need 2 ports.
Here is a sample configuration I've recently deployed, runs 4
bokeh server instances, and 2 websocket instances
(haproxy configuration)
[https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg](https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg)
(supervisord confugration, so you can see the command line options
that are being used)
[https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf](https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf)
If you're running 0.5.2, then this is much simpler, since we're
using gevent, and everything runs on one port -for that you could
just run the bokeh server and port 80, but you would need to run
it as root since port 80 needs root access to serve on.  But you
should be ready for the 2 port configuration since that's what is
going to be used going forwards.
On 08/28/2014 12:11 AM, Josh Wasserstein wrote:
To clarify, I am not looking for a solution that assumes that the
plots can be pre-computed I am using the server to refresh data
based on the input (i.e. I rely on Python scripts to query data
from an API <[http://docs.python-requests.org/en/latest/](http://docs.python-requests.org/en/latest/)> and a
SQL database depending on inputs on various widgets).
Josh
On Thu, Aug 28, 2014 at 12:02 AM, Josh Wasserstein >  > >>     <[email protected] <mailto:[email protected]>> wrote:
    Say I want to run Bokeh on a server with a firework that is
    blocking most ports (the server is internet exposed, and it
    only allows for ssh/HTTP and a few other ports). That said, I
    can start processes in the machine listening to any ports
    through localhost.
    Is there a way to set up Bokeh so that the *browser* (on the
    network) talks to the *web server* on port=80 and the
    *web-server* talks to the *bokeh-server* (within the server)
    through localhost?
    In other words, rather than:
    *client* <--network address:port=80 --> *bokeh-server*
    Have it as:
    *client* <--network address:port=80 --> *web-server*
    <--localhost:port=whatever--> *bokeh-server*
    *
    *
    Thanks,
    Josh
    *
    *
    *
    *
--
You received this message because you are subscribed to the
Google Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it,
send an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
[https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com)
<[https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer)>.
For more options, visit
[https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).
--
You received this message because you are subscribed to the Google
Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it,
send an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
[https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com)
<[https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com?utm_medium=email&utm_source=footer](https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com?utm_medium=email&utm_source=footer)>.
For more options, visit
[https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send

an email to [email protected]

mailto:[email protected].

To post to this group, send email to [email protected]

mailto:[email protected].

To view this discussion on the web visit

https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com

<https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com?utm_medium=email&utm_source=footer>.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.

Hi Walter,

That post is over a year old and Bokeh has changed a lot in that time.

In addition, the bokeh server is currently undergoing a major re-write.

···

On Thu, Sep 17, 2015 at 7:56 AM, Walter [email protected] wrote:

Can you elaborate more on this? Can you provide an example of what software and configuration you would use to do this? Is it possible to use a python simple http server?

On Thursday, August 28, 2014 at 2:16:33 PM UTC-7, Hugo Shi wrote:

Sorry - I misunderstood.

Yes it is possible, however your webserver needs to be capable of doing
http forwarding as well as websocket forwarding. I think nginx is
capable of doing this, though in my limited experience, the websocket
forwarding i got from nginx was a bit unreliable.

On Thu 28 Aug 2014 05:14:46 PM EDT, Josh Wasserstein wrote:

Thanks Hugo. We are using Bokeh 0.5.2+ (dev builds). I am not sure I

understand everything in your email.

When you said:

/If you’re running 0.5.2, then this is much simpler, since we’re using

gevent, and everything runs on one port -for that you could just run

the bokeh server and port 80, but you would need to run it as root

since port 80 needs root access to serve on.

/

the problem we have is that 80 is already used by a regular web

server and we would like to expose other ports to the network. Is the

following setup possible?

  • The client (browser on machine A) connects to web server (machine B:80).
  • The web server (machine B:80) processes the request and talks to

Bokeh server through localhost (listening on machine B:*some other

port*) to render data, and serve it (through machine B:80) to machine A.

This way we do not have to expose machine B: *to

the network. *Instead, the web server talks to the Bokeh server

through localhost.

Josh

On Thu, Aug 28, 2014 at 1:09 PM, Hugo Shi <[email protected]

mailto:[email protected]> wrote:

Sure - so the only issue, is that since we're now (in master)
running the bokeh server on 2 ports (one for regular http, and one
for websockets) you need 2 ports.
Here is a sample configuration I've recently deployed, runs 4
bokeh server instances, and 2 websocket instances
(haproxy configuration)
[https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg](https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/haproxy.cfg)
(supervisord confugration, so you can see the command line options
that are being used)
[https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf](https://github.com/ContinuumIO/bokeh/blob/scipydemo2014/scripts/supervisor.conf)
If you're running 0.5.2, then this is much simpler, since we're
using gevent, and everything runs on one port -for that you could
just run the bokeh server and port 80, but you would need to run
it as root since port 80 needs root access to serve on.  But you
should be ready for the 2 port configuration since that's what is
going to be used going forwards.
On 08/28/2014 12:11 AM, Josh Wasserstein wrote:
To clarify, I am not looking for a solution that assumes that the
plots can be pre-computed I am using the server to refresh data
based on the input (i.e. I rely on Python scripts to query data
from an API <[http://docs.python-requests.org/en/latest/](http://docs.python-requests.org/en/latest/)> and a
SQL database depending on inputs on various widgets).
Josh
On Thu, Aug 28, 2014 at 12:02 AM, Josh Wasserstein
<[email protected] <mailto:[email protected]>> wrote:
    Say I want to run Bokeh on a server with a firework that is
    blocking most ports (the server is internet exposed, and it
    only allows for ssh/HTTP and a few other ports). That said, I
    can start processes in the machine listening to any ports
    through localhost.
    Is there a way to set up Bokeh so that the *browser* (on the
    network) talks to the *web server* on port=80 and the
    *web-server* talks to the *bokeh-server* (within the server)
    through localhost?
    In other words, rather than:
    *client* <--network address:port=80 --> *bokeh-server*
    Have it as:
    *client* <--network address:port=80 --> *web-server*
    <--localhost:port=whatever--> *bokeh-server*
    *
    *
    Thanks,
    Josh
    *
    *
    *
    *
--
You received this message because you are subscribed to the
Google Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it,
send an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
[https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com)
<[https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxVqkEvhwvwCCi68CNM%3DVugt43b_eDNnjfxwft8-xoyj4Q%40mail.gmail.com?utm_medium=email&utm_source=footer)>.
For more options, visit
[https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).
--
You received this message because you are subscribed to the Google
Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it,
send an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
[https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com)
<[https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com?utm_medium=email&utm_source=footer](https://groups.google.com/a/continuum.io/d/msgid/bokeh/53FF6234.4080004%40gmail.com?utm_medium=email&utm_source=footer)>.
For more options, visit
[https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send

an email to [email protected]

mailto:[email protected].

To post to this group, send email to [email protected]

mailto:[email protected].

To view this discussion on the web visit

https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com

<https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAD4ivxXR-MsRKSQAsczKTM6OvR6_bDMn_1JwVkJX8H6GWe2zQA%40mail.gmail.com?utm_medium=email&utm_source=footer>.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.

You received this message because you are subscribed to the Google Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].

To post to this group, send email to [email protected].

To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/3a2341d5-ad81-47b8-9b95-cf94d5637cdb%40continuum.io.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.