Giter Club home page Giter Club logo

jupyterlab-variableinspector's Introduction

jupyterlab_variableinspector

Extension status PyPi_Version Build Binder

Jupyterlab extension that shows currently used variables and their values.
Contributions in any form are welcome!

Features

Demogif

  • Allows inspection of variables for both consoles and notebooks.
  • Allows inspection of matrices in a datagrid-viewer. This might not work for large matrices.
  • Allows an inline and interactive inspection of Jupyter Widgets.

Supported Languages

  • This extension is currently targets python as a main language but also supports the following languages with different levels of feature completeness

How it Works

In order to allow variable inspection, all content that is displayed first need to be sent from the kernel to the front end.
Therefore, opening large data frames with the datagrid viewer can dramatically increase your occupied memory and significantly slow down your browser.
Use at your own risk.

Requirements

  • JupyterLab >= 3.0

Requirements for python functionality

  • pandas and numpy are required to enable matrix inspection.
  • pyspark for spark support.
  • tensorflow and keras to allow inspection of tf objects.
  • torch for PyTorch support.

Requirements for R functionality

  • The repr library.

Requirements for ipywidgets functionality

The variable inspector can also display Jupyter interactive widgets:

ipywidgets

The requirements for this functionality are:

  • ipywidgets, which can be installed with pip install ipywidgets.

Install

To install the extension, execute:

pip install lckr_jupyterlab_variableinspector

Uninstall

To remove the extension, execute:

pip uninstall lckr_jupyterlab_variableinspector

Contributing

Development install

Note: You will need NodeJS to build the extension package.

The jlpm command is JupyterLab's pinned version of yarn that is installed with JupyterLab. You may use yarn or npm in lieu of jlpm below.

# Clone the repo to your local environment
# Change directory to the lckr_jupyterlab_variableinspector directory
# Install package in development mode
pip install -e "."
# Link your development version of the extension with JupyterLab
jupyter labextension develop . --overwrite
# Rebuild extension Typescript source after making changes
jlpm build

You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension.

# Watch the source directory in one terminal, automatically rebuilding when needed
jlpm watch
# Run JupyterLab in another terminal
jupyter lab

With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt).

By default, the jlpm build command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command:

jupyter lab build --minimize=False

Development uninstall

pip uninstall lckr_jupyterlab_variableinspector

In development mode, you will also need to remove the symlink created by jupyter labextension develop command. To find its location, you can run jupyter labextension list to figure out where the labextensions folder is located. Then you can remove the symlink named @lckr/jupyterlab_variableinspector within that folder.

Testing the extension

Frontend tests

This extension is using Jest for JavaScript code testing.

To execute them, execute:

jlpm
jlpm test

Integration tests

This extension uses Playwright for the integration tests (aka user level tests). More precisely, the JupyterLab helper Galata is used to handle testing the extension in JupyterLab.

More information are provided within the ui-tests README.

Packaging the extension

See RELEASE

jupyterlab-variableinspector's People

Contributors

8bit-pixies avatar alexarchambault avatar chriscarini avatar davidruhe avatar dependabot[bot] avatar elben10 avatar ericsnekbytes avatar fcollonval avatar jtpio avatar keldlundgaard avatar kentarolim10 avatar lckr avatar lucaspar avatar pandede avatar piorek avatar roger-yu-ds avatar sho-87 avatar timkpaine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jupyterlab-variableinspector's Issues

Inspection while kernel is busy

A user might inspect a matrix while the associated kernel is busy. Currently, the inspection request will be performed when the kernel becomes ready again and therefore not deliver any results prior to that.

The question is whether there is a possibility to perform such request even when the kernel is busy, e.g. on a different channel of the interactive kernel.

Add better presentation for matrices

Add a matrix view similar to RStudio. For that, use the datagrid library from phosphorjs which is already put to use in the .csv viewer in jlab.

The variable inspector should show the first few entries of a matrix in the overview table and switch to a datagrid for a detailed presentation.

To avoid performance issues the whole dataframes not loaded in advance but only of the user requests the detailed matrix presentation.

Unicode characters support

This is a very useful extension but hoping I can view unicode characters, not encoded strings in the inspector for instance below.

example

Add keyboard shortcut to open variable inspector

I imagine one could set a shortcut for this with user overrides to the settings, but it's unclear what the name of the command would be. Do you have a way to set up a shortcut for this already?

Variable Inspector should target Language Name instead of Kernel Name

Right now kernels use the name instead of the language info. This could be called through:

session.kernel.info.language_info.name

instead of session.kernel.name.

However kernel.info can be null when session.ready promise is fulfilled. So one solution might be to check session.kernel.isReady and update the target language if that is changed(?)

There may be more appropriate patterns within session.kernel, however since kernel.name can be altered and user given, the variable explorer as it stands won't support multiple conda environments as an example.

I will think more on this and see if I can come up with a solution.

Performance impact

I notice a quite important impact on performance when I activate variable inspector.

Basically, some cells that should execute very quickly, hangs for 5-10 seconds before executing. I didn't found any pattern though - it seems like it can randomly happen (quite often thought).

It seems that this is happening when there is a variable that's a big list of strings and I open the variable inspector at least once. For instance, I do this dumb test:

toto = [] for i in range(500*1000): toto.append(100*str(i))

Then I have 10 cells below with:
print(datetime.datetime.now())

that I execute quickly. Somewhere in the middle it will hang.

Feature request: descend into variables (e.g. dicts)

We use dicts to store a collection of arrays, e.g.:

data['time'] # holds an np array of time values
data['speed'] # holds an np array of speed values

Currently, the variable inspector shows the dict, but inspecting the arrays would require me to create an intermediate variable that I can inspect via the variable inspector, e.g. data_time = data['time'].

It would be great if you can descend into variables, like you can do in Matlab. The terminology in Matlab is like this:

  • Workspace window -> shows actual variables that exist currently in your workspace. This is like the "Variable Inspector" window provided by this plugin.
  • Variables window -> opens when you click a variable from the workspace. This is where you can 'descend into' variables, present them in a clean way (such as matrices), and even edit values of the variable. Descending into variables opens new tabs, see screenshot. The Matrix View that is currently provides by this plugin is somewhat similar, except that it is limited to inspecting matrices, rather than inspecting any kind of variable. It also doesn't allow descending into data structures or editing them (the latter would be a feature request on it's own, which should be treated in a separate issue I'd say).

Consider this matlab code:

s.a = 1;
s.b = {'A','B','C'};
s.c = [1,2;3,4];

Open s from Workspace and then descending into s.a, s.b, and s.c gives:

image

image

image

image

You can even descent into the cells from s.b (clicking entries in s.c would allow you to edit the matrice values), as these s.b entries can be anything (strings in this example, but could be any complex object in Matlab):

image

I realize this is probably not a feature that will be implemented on a very short term, as I guess it will take quite some work to implement, but I can imagine that people will find this kind of functionality very useful.

Missing extension module "lib/index.js"

I am trying to install the module, by first downloading it, cd into the directory, and finally running npm install from inside the directory, which seems to work. It gives this message.

Inspector-master
├─┬ @jupyterlab/[email protected] 
│ ├─┬ @jupyterlab/[email protected] 
│ │ └─┬ @jupyterlab/[email protected] 
│ │   └── [email protected] 
│ ├─┬ @jupyterlab/[email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── @jupyterlab/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├─┬ @phosphor/[email protected] 
│ │ └── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├─┬ @phosphor/[email protected] 
│ │ └── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ └── @phosphor/[email protected] 
├─┬ @jupyterlab/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├── @phosphor/[email protected] 
│ ├── @types/[email protected] 
│ ├─┬ [email protected] 
│ │ ├─┬ [email protected] 
│ │ │ ├── [email protected] 
│ │ │ ├─┬ [email protected] 
│ │ │ │ └── [email protected] 
│ │ │ ├─┬ [email protected] 
│ │ │ │ └── [email protected] 
│ │ │ ├── [email protected] 
│ │ │ └── [email protected] 
│ │ ├─┬ [email protected] 
│ │ │ └── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│   ├─┬ [email protected] 
│   │ ├── [email protected] 
│   │ ├── [email protected] 
│   │ ├─┬ [email protected] 
│   │ │ └─┬ [email protected] 
│   │ │   └── [email protected] 
│   │ ├── [email protected] 
│   │ └─┬ [email protected] 
│   │   ├── [email protected] 
│   │   ├── [email protected] 
│   │   ├── [email protected] 
│   │   ├── [email protected] 
│   │   ├── [email protected] 
│   │   └── [email protected] 
│   ├── [email protected] 
│   └── [email protected] 
├─┬ @jupyterlab/[email protected] 
│ ├─┬ @jupyterlab/[email protected] 
│ │ ├── @jupyterlab/[email protected] 
│ │ └── @jupyterlab/[email protected] 
│ ├── @jupyterlab/[email protected] 
│ └── @jupyterlab/[email protected] 
├─┬ @jupyterlab/[email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └─┬ [email protected] 
│ │   └── [email protected] 
│ ├─┬ [email protected] 
│ │ └─┬ [email protected] 
│ │   └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│   ├── [email protected] 
│   └── [email protected] 
├── @jupyterlab/[email protected] 
├─┬ @jupyterlab/[email protected] 
│ └── @phosphor/[email protected] 
├─┬ @jupyterlab/[email protected] 
│ ├─┬ [email protected] 
│ │ ├─┬ [email protected] 
│ │ │ └─┬ [email protected] 
│ │ │   └── [email protected] 
│ │ └── [email protected] 
│ └─┬ [email protected] 
│   ├── [email protected] 
│   └── [email protected] 
├── @phosphor/[email protected] 
├─┬ [email protected] 
│ └─┬ [email protected] 
│   ├── [email protected] 
│   ├─┬ [email protected] 
│   │ └── [email protected] 
│   ├── [email protected] 
│   ├─┬ [email protected] 
│   │ └─┬ [email protected] 
│   │   ├── [email protected] 
│   │   └── [email protected] 
│   ├── [email protected] 
│   └── [email protected] 
└── [email protected] 

Afterwards I am trying to run npm run build which throws following error:

> [email protected] build /home/nmvision1/lucas_stuff/jupyterlab-variableInspector-master
> tsc "."

/usr/bin/env: ‘node’: No such file or directory

npm ERR! Linux 4.13.0-45-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "run" "build" "."
npm ERR! node v4.2.6
npm ERR! npm  v3.5.2
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! [email protected] build: `tsc "."`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the [email protected] build script 'tsc "."'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the jupyterlab_variableinspector package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     tsc "."
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs jupyterlab_variableinspector
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls jupyterlab_variableinspector
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/nmvision1/lucas_stuff/jupyterlab-variableInspector-master/npm-debug.log

If I am just ignoring this, and proceed with jupyter labextension install ./jupyterlab-variableInspector-master/ I will get the error

> /usr/bin/npm pack /home/nmvision1/lucas_stuff/jupyterlab-variableInspector-master
jupyterlab_variableinspector-0.1.0.tgz

Errored, use --debug for full output:
ValueError: "/home/nmvision1/lucas_stuff/jupyterlab-variableInspector-master" is not a valid extension:
Missing extension module "lib/index.js"

Maybe it is important, that I didnt use conda install -c conda-forge nodejs but sudo apt install npm instead

Build failure

I'm seeing the below error in my container build:

'tsc' is not recognized as an internal or external command

Is typescript missing in the dependencies?

Step 26/40 : RUN git clone https://github.com/lckr/jupyterlab-variableInspector.git;     cd jupyterlab-variableInspector;     npm run build;     jupyter labextension install --no-build .
 ---> Running in bf40c8b82918
Cloning into 'jupyterlab-variableInspector'...

> [email protected] build C:\jupyterlab-variableInspector
> tsc

'tsc' is not recognized as an internal or external command,
operable program or batch file.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] build: `tsc`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\ContainerAdministrator\AppData\Roaming\npm-cache\_logs\2018-09-04T03_59_53_631Z-debug.log

Supporting other Python Frameworks Gracefully in Matrix Display

Proposed Patterns

This is to talk through support for other frameworks, and possible ways to handle it safely

  • Spark
  • Tensorflow

One approach which I've demo'ed is to use pd.get_options to control spark dataframes when pulling datasets through

spark_df.limit(<number>).toPandas()

For tensorflow variables you will inevitably pulling full matrices down.

Displaying Pandas and Numpy

One option for handling the display of data is to limit it to:

max(10**6, pd.get_option('display.max_rows')) if pd.get_option('display.max_rows') is not None else <show all>

We can do the same thing for the numpy equivalent. This should naturally flow-on to the default Pandas + Numpy variables.

Handling Imports

Using the approach shown in the Rodeo variable explorer I think the pattern for handling unknown imports (not everyone will have tensorflow/pyspark or even pandas installed):

try:
    import my_module
except ImportError:
    my_module = None

....

if my_module and isinstance(x, my_module.my_type):
    <do stuff>

If @lckr agrees, I'll ensure my PRs are aligned and cleaned up for review.

When switching to an unsupported language variable inspector should be cleared

When we switch to an unsupported language, the context should change, and variable inspect should show nothing. Possible solutions:

Approach 1

In inspectorscripts.ts:

    public static getScript( lang: string ): Promise<Languages.LanguageModel> {
        return new Promise( function( resolve, reject ) {
            if ( lang in Languages.scripts ) {
                resolve( Languages.scripts[lang] );
            } else {
                reject( "Language " + lang + " not supported yet!" );
            }
        } );
    }

Should always resolve, even if language is not supported. When going to an unsupported language, it should default to no data

Why we shouldn't do this

We may want things to fail in the way they're suppose to fail...

Approach 2

In handler.ts

This should probably be handled in _initOnKernel() in reply.

Why we shouldn't do this

???

TODOs before beta release

Things to add before a first release. (In no specific order)

  • Improve styling
  • Installation via npm
  • Improve UX
  • Add documentation

optional:

  • Make inspector table sortable
  • Add option to set max_rows
  • Add R support

Breaks for some sklearn imports

Inspector does not refresh after importing certain sklearn imports, e.g., after from sklearn.decomposition import PCA.
Reason are:

  • the kernelconnector emits query responses even on a failed execution
  • the python inspection script does call type() on None sometimes. This results in a failed execution of the fetch call.

Add requirements to README

Readme probably requires some caveats on packages installed. Currently this includes:

  • Pandas and Numpy are required for matrix inspection (it is used in Pyspark + TF matrix inspection)
  • Pyspark is optional (for Spark stuff)
  • Tensorflow and Keras are to be installed for Tensorflow objects.

Install from github raises ValueError: Missing extension module "lib/index.js"

I ran jupyter labextension install --debug https://github.com/lckr/jupyterlab-variableInspector from the README.

Full Output:

Node v11.6.0

> /usr/local/bin/npm pack https://github.com/lckr/jupyterlab-variableInspector
npm notice 
npm notice 📦  [email protected]
npm notice === Tarball Contents === 
npm notice 1.3kB package.json   
npm notice 1.1kB LICENSE        
npm notice 2.0kB README.md      
npm notice 1.0kB style/index.css
npm notice === Tarball Details === 
npm notice name:          jupyterlab_variableinspector            
npm notice version:       0.1.0                                   
npm notice filename:      jupyterlab_variableinspector-0.1.0.tgz  
npm notice package size:  2.5 kB                                  
npm notice unpacked size: 5.4 kB                                  
npm notice shasum:        05f2583b9a63807433b8560adcedd0c13a4bf5f9
npm notice integrity:     sha512-S+NLW6MVDJWFK[...]7q5qXKqi91Ibg==
npm notice total files:   4                                       
npm notice 
jupyterlab_variableinspector-0.1.0.tgz
Traceback (most recent call last):

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 77, in start
    ans = self.run_task()

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 106, in run_task
    for arg in self.extra_args

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 106, in <listcomp>
    for arg in self.extra_args

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/commands.py", line 219, in install_extension
    return handler.install_extension(extension)

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/commands.py", line 418, in install_extension
    info = self._install_extension(extension, tempdir)

  File "/Users/Atom/.miniconda/lib/python3.7/site-packages/jupyterlab/commands.py", line 1257, in _install_extension
    raise ValueError(msg % (extension, '\n'.join(messages)))

ValueError: "https://github.com/lckr/jupyterlab-variableInspector" is not a valid extension:
Missing extension module "lib/index.js"


Errored, use --debug for full output:
ValueError: "https://github.com/lckr/jupyterlab-variableInspector" is not a valid extension:
Missing extension module "lib/index.js"

I noticed the repo has no lib/index.js but it does have src/index.ts, could it be as simple as changing the path to this file in package.json?

Error while inspecting NetworkX objects

I am facing an issue when using this plugin and using NetworkX Graph objects. While I'm not using any nx.Graph object, the plugin works fine, as in the screen below:

screen shot 2018-11-28 at 09 50 21

Once I create an nx.Graph object, I'm having the problem as in the image below, and from that point the plugin stops working.

screen shot 2018-11-28 at 09 50 50

I have tracked the issue to the file inspectorscripts.ts, line 127, if str(obj)[0] == "<", where converting nx.Graph to strings does not return any character, which causes the problem while checking the first character of the string.

I have fixed my own code by including a if len(str(obj)) > 0 before the if str(obj)[0] == "<", which has solved my problem so far. Now, I am getting the following screen when using nx.Graph objects:

screen shot 2018-11-28 at 10 08 33

Please let me know if this solution is the correct one, or if I should do something else. Please also consider including this fix in the next release. The tool is great, I'm using it a lot and suggesting it to my colleagues!

Thanks! Carlos

Index cells is empty

When using pandas dataframe, with multi-index index in variable inspector is empty

screenshot from 2018-08-29 13-39-51

Cannot get matrix view to open

I tried opening the matrix view but nothing happens. From the demo in the README, it seems like I should just left-click the np array data in the "content" column. If I do that, nothing happens. I tried this for both python2 and python3 kernels, using this simple cell of code:

import numpy as np
matrix = np.random.randn(10,10)

I don't see any errors in the terminal in which I started jupyter lab.

Screenshot:
image

Using Ubuntu 16.04, Firefox 62, jupyter lab 0.35.0, and latest master from this repo build with nodejs 10.12. Also tried with Chrome 69.

By the way: great work on this plugin! I really believe it adds great value to Jupyter! Hopefully it will evolve into a rich variable inspector like we know from Matlab :)

More detail in installation instruction?

I am a little lost as to the steps to take after cloning the repo. Not exactly sure how to point NPM to this locally and load it. A little more detail on how to navigate and execute the NPM commands to install the extension would be awesome.

Installation Issue

I am a beginner and facing problem with the installation. Can anyone please guide step by step as to how to install this extension as I do not have any knowledge about npm?

matrixQuery kernel error

I was testing the following piece of Python3 code:

df = pd.DataFrame({'idx': ['A', 'B', 'C', 'D'],
                   'quantity': [3, 4, 10, 11]})

def split_quant(df):
    quantities = ([4]*(df['quantity'].iat[0] // 4)) + [df['quantity'].iat[0] % 4]

    temp = pd.DataFrame({'idx': df['idx'].iat[0],
                         'quantity': quantities
                         }, index=range(len(quantities)))

    return temp

df_split = df[df['quantity'] > 4].groupby('idx').apply(split_quant)

output = df[df['quantity'] <= 4].append(df_split).reset_index(drop=True)

The variable inspector correctly lists 3 dataframes. df and output correctly open in new windows when theirs names are clicked. However I get an error when I click on df_split

In dev tools I see the following error:

Uncaught (in promise) Kernel error on 'matrixQuery' call!
Promise.then (async)
row.onclick @ variableinspector.js:97

Seems its a ValueError where the message is "Overlapping names between the index and columns"

When I call print(df_split) I see that the dataframe looks like this:

      idx  quantity
idx                
C   0   C         4
    1   C         4
    2   C         2
D   0   D         4
    1   D         4
    2   D         3

So the overlapping names error makes sense, but more generally, whats the plan for handling hierarchical/multi index dataframes?

Question about version incompatibility

Migrate from the thread under jupyterlab.

I have following error when trying to install the extension

Errored, use --debug for full output:
ValueError:
"[email protected]" is not compatible with the current JupyterLab
Conflicting Dependencies:
JupyterLab              Extension            Package
>=0.15.4-0 <0.16.0-0    >=0.16.0-0 <0.17.0-0 @jupyterlab/application
>=0.15.4-0 <0.16.0-0    >=0.16.3-0 <0.17.0-0 @jupyterlab/notebook
>=0.15.4-0 <0.16.0-0    >=0.16.3-0 <0.17.0-0 @jupyterlab/console

I am using jupyterlab 0.32.1

jupyterlab                0.32.1                   py36_0    conda-forge

I am confused about the error. When I do

jupyter labextension --version

The output is 0.31.5, it's already >= 0.16.X

R Kernel is not recognized

I'm using "R version 3.5.3" kernel in JupyterLab and when I open variable inspector from an R notebook, it opens it with ". Language currently not supported." message. Python3 kernel works fine.

I tried changing following in kernelconnector.ts and it seems to fix the problem and correctly recognize and inspect R Kernel:

get kernelname(): string {
-    return this._session.kernel.name;
+    return this._session.kernel.info.language_info.name;
}

Not sure whether it's the right approach though.

Feature request: PyTorch Tensors

Since PyTorch tensors are very similar to Numpy arrays, is it possible to get the same inspection features for them? Their shape in particular would be great to visualize.

I can work on this if someone can point me in the right direction. I think we just need to add some lines to inspectorscripts.ts, but is there something more?

Unicode in dataframes

Unicode content in variables panel shows fine now #63.

But if there are unicode characters within a dataframe, they still won't show properly.

image

Win 10 npm install: can't jupyter lab build the inspector

please note: though I am on Windows 10, "B:" drive is not a floppy : )

I got npm install to run behind my corporate proxy. My _variableinspector reports "enabled ok*", but it's recommended that I run 'jupyter lab build'. After I did, I still have the same state. The Jupyter Lab UI also shows a dialog that I need to run jupyter lab build. Do I somehow need to explicitly include the inspector?

I just yarn-error2.log, very lightly scrubbed for my corporate id#. I tried this a second time after noticing the Docker and Anaconda paths, which are not where I'm trying to install extensions. I had the failure above, uninstalled Docker, deleted Docker paths in Windows Ctrl Panel, deleted Anaconda paths in Windows Ctrl Panel, and got all the same errors as far as I could tell. I'm not sure where the Docker and Anaconda information are still coming from in yarn-error.log .

I have now npm installed 'webpack', 'webpack-cli', and 'fs-extra'

`B:\WPy-3670q\scripts\jupyterlab-variableInspector>jupyter lab build
[LabBuildApp] JupyterLab 0.35.3
[LabBuildApp] Cleaning B:\WPy-3670q\python-3.6.7.amd64\share\jupyter\lab
Cleaning B:\WPy-3670q\python-3.6.7.amd64\share\jupyter\lab...
Success!
[LabBuildApp] Building in B:\WPy-3670q\python-3.6.7.amd64\share\jupyter\lab
[LabBuildApp] Node v8.12.0

[LabBuildApp] > B:\WPy-3670q\python-3.6.7.amd64..\t\n\npm.CMD pack B:\WPy-3670q\scripts\jupyterlab-variableInspector

[email protected] prepare B:/WPy-3670q/scripts/jupyterlab-variableInspector
npm run clean && npm run build

[email protected] clean B:\WPy-3670q\scripts\jupyterlab-variableInspector
rimraf lib

[email protected] build B:\WPy-3670q\scripts\jupyterlab-variableInspector
tsc

npm notice
npm notice package: [email protected]
npm notice === Tarball Contents ===
npm notice 1.4kB package.json
npm notice 1.1kB LICENSE
npm notice 2.0kB README.md
npm notice 2.7kB lib/handler.d.ts
npm notice 10.3kB lib/handler.js
npm notice 180B lib/index.d.ts
npm notice 10.5kB lib/index.js
npm notice 507B lib/inspectorscripts.d.ts
npm notice 8.9kB lib/inspectorscripts.js
npm notice 1.4kB lib/kernelconnector.d.ts
npm notice 3.4kB lib/kernelconnector.js
npm notice 1.2kB lib/manager.d.ts
npm notice 2.8kB lib/manager.js
npm notice 1.9kB lib/variableinspector.d.ts
npm notice 6.5kB lib/variableinspector.js
npm notice 1.0kB style/index.css
npm notice === Tarball Details ===
npm notice name: jupyterlab_variableinspector
npm notice version: 0.1.0
npm notice filename: jupyterlab_variableinspector-0.1.0.tgz
npm notice package size: 12.4 kB
npm notice unpacked size: 55.8 kB
npm notice shasum: 93344a5a23ef583ca7cdf76286bc0626dca9fa4d
npm notice integrity: sha512-vgmvZAnuTP7ER[...]UfAdPa1EjrSgw==
npm notice total files: 16
npm notice
jupyterlab_variableinspector-0.1.0.tgz
[LabBuildApp] > node B:\WPy-3670q\python-3.6.7.amd64\lib\site-packages\jupyterlab\staging\yarn.js install
yarn install v1.9.4
info No lockfile found.
[1/5] Validating package.json...
[2/5] Resolving packages...
error An unexpected error occurred: "https://registry.yarnpkg.com/@jupyterlab%2fapplication: unable to get local issuer certificate".
info If you think this is a bug, please open a bug report with the information provided in "B:\WPy-3670q\python-3.6.7.amd64\share\jupyter\lab\staging\yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
[LabBuildApp] > node B:\WPy-3670q\python-3.6.7.amd64\lib\site-packages\jupyterlab\staging\yarn.js run build
yarn run v1.9.4
$ webpack
B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\cli.js:235
throw err;
^

Error: Cannot find module 'fs-extra'
at Function.Module._resolveFilename (module.js:548:15)
at Function.Module._load (module.js:475:25)
at Module.require (module.js:597:17)
at require (B:\WPy-3670q\t\n\node_modules\webpack-cli\node_modules\v8-compile-cache\v8-compile-cache.js:159:20)
at Object. (B:\WPy-3670q\python-3.6.7.amd64\share\jupyter\lab\staging\webpack.config.js:7:10)
at Module._compile (B:\WPy-3670q\t\n\node_modules\webpack-cli\node_modules\v8-compile-cache\v8-compile-cache.js:178:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Module.require (module.js:597:17)
at require (B:\WPy-3670q\t\n\node_modules\webpack-cli\node_modules\v8-compile-cache\v8-compile-cache.js:159:20)
at WEBPACK_OPTIONS (B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\convert-argv.js:115:13)
at requireConfig (B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\convert-argv.js:117:6)
at B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\convert-argv.js:124:17
at Array.forEach ()
at module.exports (B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\convert-argv.js:122:15)
at yargs.parse (B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\cli.js:232:39)
at Object.parse (B:\WPy-3670q\t\n\node_modules\webpack-cli\node_modules\yargs\yargs.js:567:18)
at B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\cli.js:210:8
at Object. (B:\WPy-3670q\t\n\node_modules\webpack-cli\bin\cli.js:500:3)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Module.require (module.js:597:17)
at require (internal/module.js:11:18)
at Object. (B:\WPy-3670q\t\n\node_modules\webpack\bin\webpack.js:155:2)
at Module._compile (module.js:653:30)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.`
yarn-error.log
yarn-error2.log

Variable inspector update

Hi,

Great job on the variable inspector!

Btw, if i have a dataframe that's open in the variable inspector showing all the columns, and i have an operation that adds an additional column, does the variable inspector dynamically update to show the column or do I need to click on that variable for it to refresh?

Thanks

Design: table vs treeview

I'd like to start a discussion about the layout to use.
I fully understand why Matlab-like softwares use table like layout as they focus on values and originally do not have object-oriented data structure. But this is not the case in general for Python and lots of other languages.
So a tree view, like the one used in Pycharm could be a more general solution.
variables pane

In particular, basic types are directly seen in the tree. And array can be seen in details in side panels as you have done.
The object attributes will be looked for only when the user is expanding the object leaf.

Absolute Path

Awesome job on the extension this should be really useful😊! Just one note, I tried to configure the path to var_list.py using an absolute path, although I had no luck with this approach. I was finally able to get it to work by specifying the path relative to whatever current working directory I am running jupyter lab. Maybe, I am just configuring the path wrong but I just wanted to make this note.

JupyterLab 0.34.0 support

...would be great to have!

"[email protected]" is not compatible with the current JupyterLab
Conflicting Dependencies:
JupyterLab              Extension        Package
>=0.18.2 <0.19.0        >=0.17.0 <0.18.0 @jupyterlab/application
>=0.18.2 <0.19.0        >=0.17.0 <0.18.0 @jupyterlab/console
>=0.18.2 <0.19.0        >=0.17.0 <0.18.0 @jupyterlab/notebook
>=0.18.2 <0.19.0        >=0.17.0 <0.18.0 @jupyterlab/apputils

UI/UX suggestions

First, thanks for working on this extension - I think it's incredibly important functionality for JupyterLab and is one of the most requested features from my users!

I'm just starting to try it out and have a couple of suggestions.

image

  • Since space is at a premium the shape column should just show the shape tuple - e.g. (100, 3).
    The datatype (Array/DataFrame) is redundant since it just duplicates the TYPE column
    The rows/columns are redundant since they're implicit in the ordering
  • After the type and shape the next most important information for me is the dtype so I'm wondering if there is some way to incorporate that? For the DataFrame seeing the column names (under content) is nice but it woudl be more useful if it were a name: type mapping. I can imagine that might quickly become too much information to display but thought I'd mention it in case anyone has a good solution.
  • I'm not sure of the utility of the content view as is since space is often too limited to show enough information. Perhaps displaying the content is best left for a specific content-view triggered on double-click - as is already done.
    Edit: I guess it's very useful to quickly see the value of scalars or e.g. short tuples/lists 🤔

Cannot install - Version incompatibility

I am attempting to install this but I am encountering some issues.

When I run:

jupyter labextension install .

I get:

"[email protected]" is not compatible with the current JupyterLab
Conflicting Dependencies:
JupyterLab Extension Package

=0.19.1 <0.20.0 >=0.18.0 <0.19.0 @jupyterlab/application
=0.19.1 <0.20.0 >=0.18.0 <0.19.0 @jupyterlab/apputils
=0.19.1 <0.20.0 >=0.18.0 <0.19.0 @jupyterlab/console
=0.19.1 <0.20.0 >=0.18.0 <0.19.0 @jupyterlab/notebook

The results of:

jupyter lab --version

Is:

0.35.0

The full output with debug is below:

File "/usr/local/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 77, in start
ans = self.run_task()

File "/usr/local/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 106, in run_task
for arg in self.extra_args

File "/usr/local/lib/python3.7/site-packages/jupyterlab/labextensions.py", line 106, in
for arg in self.extra_args

File "/usr/local/lib/python3.7/site-packages/jupyterlab/commands.py", line 219, in install_extension
return handler.install_extension(extension)

File "/usr/local/lib/python3.7/site-packages/jupyterlab/commands.py", line 418, in install_extension
info = self._install_extension(extension, tempdir)

File "/usr/local/lib/python3.7/site-packages/jupyterlab/commands.py", line 1293, in _install_extension
raise ValueError(msg)

I did some poking around and it appears that my staging json file may have the wrong version in it? I am not sure what this is or how to fix.

File path:

/usr/local/lib/python3.7/site-packages/jupyterlab/staging/package.json

File contents below:

{
"name": "@jupyterlab/application-top",
"version": "0.19.1",
"private": true,
"scripts": {
"build": "webpack",
"build:prod": "webpack --config webpack.prod.config.js",
"build:prod:stats": "webpack --profile --config webpack.prod.config.js --json > stats.json",
"build:stats": "webpack --profile --json > stats.json",
"clean": "rimraf build",
"prepublishOnly": "npm run build",
"watch": "webpack --watch"
},
"dependencies": {
"@jupyterlab/application": "^0.19.1",
"@jupyterlab/application-extension": "^0.19.1",
"@jupyterlab/apputils": "^0.19.1",
"@jupyterlab/apputils-extension": "^0.19.1",
"@jupyterlab/attachments": "^0.19.1",
"@jupyterlab/cells": "^0.19.1",
"@jupyterlab/codeeditor": "^0.19.1",
"@jupyterlab/codemirror": "^0.19.1",
"@jupyterlab/codemirror-extension": "^0.19.1",
"@jupyterlab/completer": "^0.19.1",
"@jupyterlab/completer-extension": "^0.19.1",
"@jupyterlab/console": "^0.19.1",
"@jupyterlab/console-extension": "^0.19.1",
"@jupyterlab/coreutils": "^2.2.1",
"@jupyterlab/csvviewer": "^0.19.1",
"@jupyterlab/csvviewer-extension": "^0.19.1",
"@jupyterlab/docmanager": "^0.19.1",
"@jupyterlab/docmanager-extension": "^0.19.1",
"@jupyterlab/docregistry": "^0.19.1",
"@jupyterlab/extensionmanager": "^0.19.1",
"@jupyterlab/extensionmanager-extension": "^0.19.1",
"@jupyterlab/faq-extension": "^0.19.1",
"@jupyterlab/filebrowser": "^0.19.1",
"@jupyterlab/filebrowser-extension": "^0.19.1",
"@jupyterlab/fileeditor": "^0.19.1",
"@jupyterlab/fileeditor-extension": "^0.19.1",
"@jupyterlab/help-extension": "^0.19.1",
"@jupyterlab/imageviewer": "^0.19.1",
"@jupyterlab/imageviewer-extension": "^0.19.1",
"@jupyterlab/inspector": "^0.19.1",
"@jupyterlab/inspector-extension": "^0.19.1",
"@jupyterlab/javascript-extension": "^0.19.1",
"@jupyterlab/json-extension": "^0.18.1",
"@jupyterlab/launcher": "^0.19.1",
"@jupyterlab/launcher-extension": "^0.19.1",
"@jupyterlab/mainmenu": "^0.8.1",
"@jupyterlab/mainmenu-extension": "^0.8.1",
"@jupyterlab/markdownviewer-extension": "^0.19.1",
"@jupyterlab/mathjax2": "^0.7.1",
"@jupyterlab/mathjax2-extension": "^0.7.1",
"@jupyterlab/notebook": "^0.19.1",
"@jupyterlab/notebook-extension": "^0.19.1",
"@jupyterlab/observables": "^2.1.1",
"@jupyterlab/outputarea": "^0.19.1",
"@jupyterlab/pdf-extension": "^0.10.1",
"@jupyterlab/rendermime": "^0.19.1",
"@jupyterlab/rendermime-extension": "^0.13.1",
"@jupyterlab/rendermime-interfaces": "^1.2.1",
"@jupyterlab/running": "^0.19.1",
"@jupyterlab/running-extension": "^0.19.1",
"@jupyterlab/services": "^3.2.1",
"@jupyterlab/settingeditor": "^0.8.1",
"@jupyterlab/settingeditor-extension": "^0.14.1",
"@jupyterlab/shortcuts-extension": "^0.19.1",
"@jupyterlab/tabmanager-extension": "^0.19.1",
"@jupyterlab/terminal": "^0.19.1",
"@jupyterlab/terminal-extension": "^0.19.1",
"@jupyterlab/theme-dark-extension": "^0.19.1",
"@jupyterlab/theme-light-extension": "^0.19.1",
"@jupyterlab/tooltip": "^0.19.1",
"@jupyterlab/tooltip-extension": "^0.19.1",
"@jupyterlab/vdom-extension": "^0.18.1",
"@jupyterlab/vega4-extension": "^0.18.1",
"@phosphor/algorithm": "^1.1.2",
"@phosphor/application": "^1.6.0",
"@phosphor/commands": "^1.6.1",
"@phosphor/coreutils": "^1.3.0",
"@phosphor/datagrid": "^0.1.6",
"@phosphor/disposable": "^1.1.2",
"@phosphor/domutils": "^1.1.2",
"@phosphor/dragdrop": "^1.3.0",
"@phosphor/messaging": "^1.2.2",
"@phosphor/properties": "^1.1.2",
"@phosphor/signaling": "^1.2.2",
"@phosphor/virtualdom": "^1.1.2",
"@phosphor/widgets": "^1.6.0",
"ajv": "~5.1.6",
"ansi_up": "^3.0.0",
"codemirror": "~5.39.0",
"comment-json": "^1.1.3",
"es6-promise": "~4.1.1",
"marked": "~0.4.0",
"moment": "~2.21.0",
"path-posix": "~1.0.0",
"react": "~16.4.2",
"react-dom": "~16.4.2",
"react-paginate": "^5.2.3",
"sanitize-html": "~1.18.2",
"semver": "^5.5.0",
"url-parse": "~1.4.3",
"xterm": "~3.3.0"
},
"devDependencies": {
"@jupyterlab/buildutils": "^0.11.1",
"css-loader": "~0.28.7",
"duplicate-package-checker-webpack-plugin": "^3.0.0",
"file-loader": "~1.1.11",
"fs-extra": "~4.0.2",
"glob": "~7.1.2",
"handlebars": "~4.0.11",
"html-loader": "^0.5.1",
"html-webpack-plugin": "~3.2.0",
"raw-loader": "~0.5.1",
"rimraf": "~2.6.2",
"sort-package-json": "~1.7.1",
"source-map-loader": "~0.2.1",
"style-loader": "~0.21.0",
"uglifyjs-webpack-plugin": "~1.2.5",
"url-loader": "~1.0.1",
"webpack": "~4.12.0",
"webpack-cli": "^3.0.3",
"webpack-merge": "^4.1.1"
},
"engines": {
"node": ">=6.11.5"
},
"jupyterlab": {
"extensions": {
"@jupyterlab/application-extension": "",
"@jupyterlab/apputils-extension": "",
"@jupyterlab/codemirror-extension": "",
"@jupyterlab/completer-extension": "",
"@jupyterlab/console-extension": "",
"@jupyterlab/csvviewer-extension": "",
"@jupyterlab/docmanager-extension": "",
"@jupyterlab/extensionmanager-extension": "",
"@jupyterlab/faq-extension": "",
"@jupyterlab/filebrowser-extension": "",
"@jupyterlab/fileeditor-extension": "",
"@jupyterlab/help-extension": "",
"@jupyterlab/imageviewer-extension": "",
"@jupyterlab/inspector-extension": "",
"@jupyterlab/launcher-extension": "",
"@jupyterlab/mainmenu-extension": "",
"@jupyterlab/mathjax2-extension": "",
"@jupyterlab/notebook-extension": "",
"@jupyterlab/rendermime-extension": "",
"@jupyterlab/running-extension": "",
"@jupyterlab/settingeditor-extension": "",
"@jupyterlab/shortcuts-extension": "",
"@jupyterlab/tabmanager-extension": "",
"@jupyterlab/terminal-extension": "",
"@jupyterlab/theme-dark-extension": "",
"@jupyterlab/theme-light-extension": "",
"@jupyterlab/tooltip-extension": ""
},
"mimeExtensions": {
"@jupyterlab/javascript-extension": "",
"@jupyterlab/json-extension": "",
"@jupyterlab/markdownviewer-extension": "",
"@jupyterlab/pdf-extension": "",
"@jupyterlab/vdom-extension": "",
"@jupyterlab/vega4-extension": ""
},
"name": "JupyterLab",
"buildDir": "./build",
"outputDir": "..",
"singletonPackages": [
"@jupyterlab/application",
"@jupyterlab/apputils",
"@jupyterlab/console",
"@jupyterlab/coreutils",
"@jupyterlab/docmanager",
"@jupyterlab/extensionmanager",
"@jupyterlab/filebrowser",
"@jupyterlab/fileeditor",
"@jupyterlab/imageviewer",
"@jupyterlab/launcher",
"@jupyterlab/notebook",
"@jupyterlab/rendermime",
"@jupyterlab/rendermime-interfaces",
"@jupyterlab/services",
"@jupyterlab/terminal",
"@jupyterlab/tooltip",
"@phosphor/coreutils",
"@phosphor/widgets"
],
"vendor": [
"@phosphor/algorithm",
"@phosphor/application",
"@phosphor/commands",
"@phosphor/coreutils",
"@phosphor/datagrid",
"@phosphor/disposable",
"@phosphor/domutils",
"@phosphor/dragdrop",
"@phosphor/messaging",
"@phosphor/properties",
"@phosphor/signaling",
"@phosphor/virtualdom",
"@phosphor/widgets",
"ajv",
"ansi_up",
"codemirror",
"comment-json",
"es6-promise",
"marked",
"moment",
"path-posix",
"react",
"react-dom",
"react-paginate",
"sanitize-html",
"semver",
"url-parse",
"xterm"
],
"version": "0.35.0",
"linkedPackages": {},
"staticDir": "../static"
}
}

Any assistance would be great. I have already tried:

  • pip install jupyterlab (again)

MacOS High Sierra Version 10.13.6

Show array contents in matrix form only shows index

I installed variableinspector using

jupyter labextension install @lckr/jupyterlab_variableinspector

And it seems like it installed okay:

@lamoslab [~] cndjph jupyter labextension list
JupyterLab v0.35.4
Known labextensions:
   app dir: /home/jupyterhub/conda/envs/prod/share/jupyter/lab
        @jupyter-widgets/jupyterlab-manager v0.38.1  enabled  OK
        @jupyterlab/git v0.5.0  enabled  OK
        @jupyterlab/hub-extension v0.12.0  enabled  OK
        @jupyterlab/toc v0.6.0  enabled  OK
        @lckr/jupyterlab_variableinspector v0.1.0  enabled  OK
        beakerx-jupyterlab v1.3.0  enabled  OK
        nbdime-jupyterlab v0.6.0  enabled  OK

When in JupyterLab I run

import numpy as np
a = np.random.randn(100).reshape((10, 10))

I do see the array a in the variable inspector.

However, when I now click on the "Content" of the array in varableinspector, a new "window" pops up, looking something like this:

index
0
1
2
3
4
5
6
7
8
9

Any idea what's going on here?

Problem with R big dataframe

Hi,

Really appreciate your time on making this extension. I have one small issue that you can probably helped to fix it easily. Sometimes I have to load huge dataframe with the R kernel on jupyterlab and I found that the inspector printed all the dataframe content. Is it possible to format it the same way as loading df in Python? Or is there anyway to disable temporarily the content column?

Thanks!!!

image

Only show dataframe contents once

Currently you can click on a dataframe to show its contents in a separate window, but if you click the dataframe name again in the inspector it will open another window with the same contents, leaving you with 2 (or more) identical windows

Would it be possible to first check whether the dataframe is open, and if it is then set focus to the currently opened window instead of opening a new one?

Unexpected token - punctuation in tsv file

I have a tab-separated file that looks something like this (notice the apostrophe):

title	group
It's an apostrophe	ABC

Which I read using:

df = pd.read_csv('test.tsv', sep='\t')

Pandas can read this fine - if you print(df) it will show the data correctly. It also shows up in the variable inspector list but if you click the dataframe to view the contents I get the following error because of the apostrophe:

default.js:132 SyntaxError: Unexpected token ' in JSON at position 208
    at JSON.parse (<anonymous>)
    at handler.js:150
    at kernelconnector.js:88
    at KernelFutureHandler.<anonymous> (future.js:212)
    at Generator.next (<anonymous>)
    at fulfilled (future.js:6)

Add support for other languages

To add support for a new kernel, one has to:

  • provide a script which loads required modules and defines a function which lists all variables, together with their name, type, size and content.
  • The output of this function must be a JSON representation of each variable, i.e. a list of objects with keys 'varName','varType', 'varSize', 'varContent',
  • Provide a command to to query the kernel for a recent list of variables. (usually this is a call to the function defined in the library above).

This information should be added to the inspectorscript.ts file. One cavet: the key to the script-dictionary in the inspectorscripts.ts file has to match the name field of the kernel running the progamming language. (Example: "python3" for a python3 kernel, "ir" for a interactive R kernel)

Console Spam

When I start a console from a notebook with activated variable inspector, every change of a variable causes that the whole content of the variable explorer ist printed to the console. This leads to a practically unusable console, as it is just spammed with the the whole variable inspector content over and over again.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.