Giter Club home page Giter Club logo

emacs-ipython-notebook's Introduction

EIN -- Emacs IPython Notebook Build Status

--- or EIN Is not only for Notebooks.

Note

It is stable enough for my day to day work, but I can't guarantee the safety for your notebook data. So please make sure you have backup.

Screenshot

Plotting in Emacs IPython Notebook

See more!

Features

Emacs IPython Notebook (EIN) provides a IPython Notebook client and integrated REPL (like SLIME) in Emacs. While EIN makes notebook editing very powerful by allowing you to use any Emacs features, it also expose IPython features such as code evaluation, object inspection and code completion to the Emacs side. These features can be accessed anywhere in Emacs and improve Python code editing and reading in Emacs.

Highlighted features:

  • Copy/paste cells, even to/from different notebooks.
  • Console integration: You can easily connect to kernel via console application. This enables you to start debugging in the same kernel. It is even possible to connect console over ssh.
  • IPython kernel can be "connected" to any buffers. This enables you to evaluate buffer/region using same kernel as notebook. Notebook goodies such as tooltip help, help browser and code completion are available in these buffers.
  • Jump to definition (go to the definition by hitting M-. over an object).

Other notebook features:

  • Inline images
  • Auto/manual-completion
  • Popup (tooltip) help
  • Syntax highlighting in each cell types (Python/Markdown)
  • Help browser (opens when executing function?)
  • Traceback viewer

Links:

Quick try

This is a quick and clean way to try EIN separately from your Emacs setting. If you want to try EIN but think preparing all the requirements is too much, try this!:

git clone git://github.com/tkf/emacs-ipython-notebook.git
cd emacs-ipython-notebook/
lisp/zeroein.el

This will launch a new Emacs instance.

You can use environment variable EMACS to control Emacs executable to use.:

EMACS=emacs-snapshot lisp/zeroein.el

The above command requires /bin/sh. If the above command does not work (e.g., you are using MS Windows), try the following command:

emacs -Q -l lisp/zeroein.el

Requirements

  • IPython 0.12 or higher.
  • websocket.el 0.9
  • request.el >= 0.2
  • (optional) mumamo developmental version: It will be automatically loaded when it is on the path. The official way to setup path is to load nXhtml.
  • (optional) markdown-mode
  • (optional) python-mode: It should work with either python.el or python-mode.el. Fabian Gallina's python.el is required to use ein:console-open command.
  • (optional) auto-complete.el You need to configure subpackage ein-ac to enable this feature.
  • (optional) smartrep.el: This package enables you to omit typing prefix keys (e.g., C-c C-n C-n C-n ... instead of C-c C-n C-c C-n C-c C-n ...). You need to configure subpackage ein-smartrep to enable this feature.

Also, EIN heavily relies on standard Emacs libraries including EWOC, EIEIO and json.el. EIN is currently tested against Emacs 23.3 and 24.3. It is known to work in Emacs 23.2, 24.1 and 24.2.

Usage

  1. Install module. Put Emacs lisp ein*.el files and Python file ein.py in your load path. See online documentation for more information.

  2. Require module:

    (require 'ein)
    
  3. Start IPython notebook server.

  4. Hit M-x ein:notebooklist-open to open notebook list.

Subpackages

Enable auto-complete.el:

(setq ein:use-auto-complete t)
;; Or, to enable "superpack" (a little bit hacky improvements):
;; (setq ein:use-auto-complete-superpack t)

Enable smartrep.el:

(setq ein:use-smartrep t)

Keybinds - Notebook

key             binding
---             -------

C-c             Prefix Command
C-x             Prefix Command
ESC             Prefix Command
.               ein:notebook-complete-dot
C-:             ein:shared-output-eval-string
<C-down>        ein:worksheet-goto-next-input
<C-up>          ein:worksheet-goto-prev-input
<M-S-return>    ein:worksheet-execute-cell-and-insert-below
<M-down>        ein:worksheet-move-cell-down
<M-up>          ein:worksheet-move-cell-up

C-x C-s         ein:notebook-save-notebook-command
C-x C-w         ein:notebook-rename-command

M-RET           ein:worksheet-execute-cell-and-goto-next
M-,             ein:pytools-jump-back-command
M-.             ein:pytools-jump-to-source-command
M-n             ein:worksheet-next-input-history
M-p             ein:worksheet-previous-input-history

C-c C-a         ein:worksheet-insert-cell-above
C-c C-b         ein:worksheet-insert-cell-below
C-c C-c         ein:worksheet-execute-cell
C-c C-e         ein:worksheet-toggle-output
C-c C-f         ein:pytools-request-tooltip-or-help
C-c TAB         ein:completer-complete
C-c C-k         ein:worksheet-kill-cell
C-c C-l         ein:worksheet-clear-output
C-c RET         ein:worksheet-merge-cell
C-c C-n         ein:worksheet-goto-next-input
C-c C-o         ein:console-open
C-c C-p         ein:worksheet-goto-prev-input
C-c C-q         ein:notebook-kill-kernel-then-close-command
C-c C-r         ein:notebook-restart-kernel-command
C-c C-s         ein:worksheet-split-cell-at-point
C-c C-t         ein:worksheet-toggle-cell-type
C-c C-u         ein:worksheet-change-cell-type
C-c C-v         ein:worksheet-set-output-visibility-all
C-c C-w         ein:worksheet-copy-cell
C-c C-x         ein:tb-show
C-c C-y         ein:worksheet-yank-cell
C-c C-z         ein:notebook-kernel-interrupt-command
C-c ESC         Prefix Command
C-c !           ein:worksheet-rename-sheet
C-c +           ein:notebook-worksheet-insert-next
C-c -           ein:notebook-worksheet-delete
C-c 1           ein:notebook-worksheet-open-1th
C-c 2           ein:notebook-worksheet-open-2th
C-c 3           ein:notebook-worksheet-open-3th
C-c 4           ein:notebook-worksheet-open-4th
C-c 5           ein:notebook-worksheet-open-5th
C-c 6           ein:notebook-worksheet-open-6th
C-c 7           ein:notebook-worksheet-open-7th
C-c 8           ein:notebook-worksheet-open-8th
C-c 9           ein:notebook-worksheet-open-last
C-c {           ein:notebook-worksheet-open-prev-or-last
C-c }           ein:notebook-worksheet-open-next-or-first
C-c C-S-l       ein:worksheet-clear-all-output
C-c C-#         ein:notebook-close
C-c C-'         ein:worksheet-turn-on-autoexec
C-c C-,         ein:pytools-jump-back-command
C-c C-.         ein:pytools-jump-to-source-command
C-c C-/         ein:notebook-scratchsheet-open
C-c C-;         ein:shared-output-show-code-cell-at-point
C-c <down>      ein:worksheet-move-cell-down
C-c <up>        ein:worksheet-move-cell-up

C-c M-+         ein:notebook-worksheet-insert-prev
C-c M-w         ein:worksheet-copy-cell
C-c M-{         ein:notebook-worksheet-move-prev
C-c M-}         ein:notebook-worksheet-move-next

Keybinds - Connect

In Python (or any other) buffer, you can connect to any open notebook by M-x ein:connect-to-notebook then choose appropriate notebook. After connecting to the notebook (and hence its kernel), the following commands are available.

key             binding
---             -------

C-c             Prefix Command
ESC             Prefix Command
.               ein:completer-dot-complete
C-:             ein:shared-output-eval-string

M-,             ein:pytools-jump-back-command
M-.             ein:pytools-jump-to-source-command

C-c C-a         ein:connect-toggle-autoexec
C-c C-c         ein:connect-run-or-eval-buffer
C-c C-f         ein:pytools-request-tooltip-or-help
C-c TAB         ein:completer-complete
C-c C-l         ein:connect-reload-buffer
C-c C-o         ein:console-open
C-c C-r         ein:connect-eval-region
C-c C-x         ein:tb-show
C-c C-z         ein:connect-pop-to-notebook
C-c C-,         ein:pytools-jump-back-command
C-c C-.         ein:pytools-jump-to-source-command
C-c C-/         ein:notebook-scratchsheet-open

License

Emacs IPython Notebook is licensed under GPL v3. See COPYING for details.

emacs-ipython-notebook's People

Contributors

jhamrick avatar stuhlmueller avatar tkf avatar yarikoptic 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emacs-ipython-notebook's Issues

How to get titles displaying in a different font?

I see various customize options in ein for what fonts to use to display different level titles, but my titles just display in Emacs as plain text, e.g.,

Header 1

Header 2

I'm probably missing something trivial, but how do I get them to display properly?

kernel is not ready yet

I get this message when I try to execute anything in a newly opened notebook.

On opening a notebook, the following appears in Messages:

error in process filter: if: Wrong number of arguments: #[(name buffer host service) "ÄÅ�Æ   Ç
�&��" [name buffer host service make-network-process :name :buffer :host :service] 9 "Open a TCP connection for a service to a host.
Returns a subprocess-object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.

NAME is the name for the process.  It is modified if necessary to make
 it unique.
BUFFER is the buffer (or buffer name) to associate with the
 process.  Process output goes at end of that buffer.  BUFFER may
 be nil, meaning that this process is not associated with any buffer.
HOST is the name or IP address of the host to connect to.
SERVICE is the name of the service desired, or an integer specifying
 a port number to connect to.

This is a wrapper around `make-network-process', and only offers a
subset of its functionality."], 8
error in process filter: Wrong number of arguments: #[(name buffer host service) "ÄÅ�Æ   Ç
�&��" [name buffer host service make-network-process :name :buffer :host :service] 9 "Open a TCP connection for a service to a host.
Returns a subprocess-object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.

NAME is the name for the process.  It is modified if necessary to make
 it unique.
BUFFER is the buffer (or buffer name) to associate with the
 process.  Process output goes at end of that buffer.  BUFFER may
 be nil, meaning that this process is not associated with any buffer.
HOST is the name or IP address of the host to connect to.
SERVICE is the name of the service desired, or an integer specifying
 a port number to connect to.

This is a wrapper around `make-network-process', and only offers a
subset of its functionality."], 8

After attempting to execute print "something" in a cell, the tail of ein:log-all looks like this:

[debug] Opening notebook at http://127.0.0.1:8888/notebooks/8c2b1350-c164-4dc3-a061-b163d6eda191 @#<buffer *ein:notebooklist 8888*>
[debug] EIN:QUERY-AJAX @#<buffer *ein:notebooklist 8888*>
[debug] Start querying: http://127.0.0.1:8888/notebooks/8c2b1350-c164-4dc3-a061-b163d6eda191 @#<buffer *ein:notebooklist 8888*>
[debug] Start timer: timeout=60000 ms @#<buffer *ein:notebooklist 8888*>
[debug] EIN:QUERY-AJAX-CALLBACK @#<buffer  *http 127.0.0.1:8888*>
[debug] status = nil @#<buffer  *http 127.0.0.1:8888*>
[debug] url-http-response-status = 200 @#<buffer  *http 127.0.0.1:8888*>
[debug] (buffer-string) =
HTTP/1.1 200 OK
Content-Length: 103
Content-Disposition: attachment; filename="Untitled0.ipynb"
Server: TornadoServer/2.3
Last-Modified: Sat, 28 Jul 2012 02:11:07 GMT
Etag: "d0196f981d8ca623e6efb94f20048a11aa7bfe93"
Content-Type: application/json
Set-Cookie: username=; expires=Fri, 29 Jul 2011 02:28:22 GMT; Path=/

{
 "metadata": {
  "name": "Untitled0"
 }, 
 "name": "Untitled0", 
 "nbformat": 2, 
 "worksheets": []
} @#<buffer  *http 127.0.0.1:8888*>
[debug] EIN:QUERY-AJAX-CANCEL-TIMER @#<buffer  *http 127.0.0.1:8888*>
[debug] data = (:worksheets nil :nbformat 2 :name Untitled0 :metadata ...) @#<buffer *scratch*>
[debug] canceled = nil @#<buffer *scratch*>
[debug] Executing success/error callback. @#<buffer *scratch*>
[debug] URL-RETRIEVE nodtebook-id = "8c2b1350-c164-4dc3-a061-b163d6eda191", status = nil @#<buffer *scratch*>
[verbose] Start logging. @#<buffer *ein: 8888/Untitled0*>
[debug] EIN:QUERY-AJAX @#<buffer *ein: 8888/Untitled0*>
[debug] Start querying: http://127.0.0.1:8888/kernels?notebook=8c2b1350-c164-4dc3-a061-b163d6eda191 @#<buffer *ein: 8888/Untitled0*>
[debug] Start timer: timeout=1000 ms @#<buffer *ein: 8888/Untitled0*>
[info] Notebook Untitled0 is ready @#<buffer *ein: 8888/Untitled0*>
[debug] Executing status-code callback. @#<buffer *scratch*>
[debug] EIN:QUERY-AJAX-CALLBACK @#<buffer  *http 127.0.0.1:8888*>
[debug] status = nil @#<buffer  *http 127.0.0.1:8888*>
[debug] url-http-response-status = 200 @#<buffer  *http 127.0.0.1:8888*>
[debug] (buffer-string) =
HTTP/1.1 200 OK
Content-Length: 83
Content-Type: text/html; charset=UTF-8
Location: /907511d6-c6a5-4eb2-a0f8-7bc51246a340
Server: TornadoServer/2.3
Set-Cookie: username=; expires=Fri, 29 Jul 2011 02:28:22 GMT; Path=/

{"kernel_id":"907511d6-c6a5-4eb2-a0f8-7bc51246a340","ws_url":"ws://127.0.0.1:8888"} @#<buffer  *http 127.0.0.1:8888*>
[debug] EIN:QUERY-AJAX-CANCEL-TIMER @#<buffer  *http 127.0.0.1:8888*>
[debug] data = (:ws_url ws://127.0.0.1:8888 :kernel_id 907511d6-c6a5-4eb2-a0f8-7bc51246a340) @#<buffer *scratch*>
[debug] canceled = nil @#<buffer *scratch*>
[debug] Executing success/error callback. @#<buffer *scratch*>
[info] Kernel started: 907511d6-c6a5-4eb2-a0f8-7bc51246a340 @#<buffer *scratch*>
[info] Starting WS: "ws://127.0.0.1:8888/kernels/907511d6-c6a5-4eb2-a0f8-7bc51246a340" @#<buffer *scratch*>
[warn] Kernel is not ready yet! (or closed already.) @#<buffer *ein: 8888/Untitled0*>

Sage support

I'd really to be able to use something like this with sage. I gave it a try with Sage 5.2, running with IPython 0.13, but it just said ein: [error] Error (error) while opening notebook list at the server 8092. I'm unfamiliar with the IPython notebook but does it require a username and password to log in? I think that might be why it wasn't working.

zeroein load path

In order to get zeroein.el to load the ein elisp files, I had to change the load list from

'("ein" "markdown-mode" "websocket" "python" "auto-complete" "popup" "fuzzy" "pos-tip" "smartrep")

to

'("ein/lisp" "markdown-mode" "websocket" "python" "auto-complete" "popup" "fuzzy" "pos-tip" "smartrep").

I don't know whether this issue is specific to my configuration (Emacs 23 on Debian).

Specify logging level package-by-package basis

This makes easy to log one sub-package (e.g., ein-kernel.el) without contaminating log buffer by debugging messages from other sub-packages (e.g., ein-mumamuo.el, which sends a lot of messages).

ein: [error] Cannot open load file: mumamo-cmirr

I'm attempting to install EIN. The ein:notebooklist opens fine, but when I attempt to open a notebook, i receive the following error:
" Cannot open load file: mumamo-cmirr"

and the Notebook opens in the Fundamental mode.

Any suggestions?

Thanks,
Aaron

Organize directory

Putting many files in top level directory is a bit ugly.
But how to do it properly?

relevant: #5

Directory organization in other projects

Just a quick lookup.

Lisp code lies under lisp/ (no subdirectories under it):

% cd ~/.emacs.d/el-get/el-get/recipes
% grep '"lisp"' *.rcp                          
ess.rcp:       :load-path ("lisp")
jdee.rcp:  :load-path ("lisp" "elib"))
nognus.rcp:       :load-path ("lisp")
org-mode.rcp:       :load-path ("." "lisp" "contrib/lisp")
reftex.rcp:       :load-path ("lisp")
session.rcp:       :load-path ("lisp")

Flat (like current EIN):

Use headlines to overview notebook structure

IPython notebook 0.13 supports headline cells. Overview buffer using something like direx should be useful. Maybe this feature should be extensible for more than two worksheets because IPython might support it in 0.14 (or later).

Make ein-kernel.el work without notebook

This allows kernel to be used in any buffer. It will provide good completion, annotation and evaluation backend. I need to add more test for ein-kernel.el and then refactor it.

Example usage:

  • Completion, annotation and evaluation in Python buffer.
  • Matplotlib interface for Emacs Lisp.

Tab-completion (C-c TAB) not working with remote kernal.

EIN is fantastic, and it is working perfectly with my local notebook.

However, I often connect to a remote notebook. To do this I set up a ssh tunnel, such that I can still access the remote notebook on the localhost (e.g. http://127.0.0.1:9999). The setup works perfectly in my broswer (including tab complete, inline plotting, etc).

Within EIN I can still connect to the remote notebook, execute cells, view output, etc... but I'm unable to do any tab complete using C-c TAB. Doing so returns the following error message:

Error found in callback `on-message': nil

Any insight?

Thanks,
Aaron

Cell highlighting using pygmentize and ansi-color

MuMaMo is nice but it takes a little bit too much CPU power and I need some hack to use it with auto-complete. So, maybe it's better to have alternative.

This is a proof of concept snippet:

(defun my-pop-to-pygmentized (string lexer)
  (with-current-buffer (get-buffer-create "*my pygmentized*")
    (erase-buffer)
    (insert string)
    (shell-command-on-region
     (point-min) (point-max)
     (format "pygmentize -l %s" lexer)
     nil t)
    (ansi-color-apply-on-region (point-min) (point-max))
    (pop-to-buffer (current-buffer))))

(my-pop-to-pygmentized "\
import numpy
numpy.arange(0, 10)" "python")

Error on opening notebook

I just discovered ein by accident, and love the idea. I installed it on Emacs 24.1 (WIndows and OS X), fired up the iPython notebook, and tried to open a notebook I'd previously created in my Web browser. Unfortunately, opening the file (on both systems) gives me the following error (here I'm copying what's shown in my Messages buffer):

Contacting host: 127.0.0.1:8888
Opened notebook list at 8888
Open notebook analyze.
Contacting host: 127.0.0.1:8888
ein: [error] Wrong number of arguments: #[... "p�\306 ���\307\310
�\311\211 \311&�+`��p� \211��\312H��>\204)

Actually, the error message is a lot longer than this, but I think it contains binary control characters that screw up my ability to paste it here... The only recognizable text in the error message is at the end,

[pretty-printer dll buffer pos new-ewoc old-buffer ewoc--dll-create vector cl-struct-ewoc nil ...] 9 ...], 4

Any idea what's going wrong? I'd love to get this running.

Thanks.

Pressing tab to ident sometimes gives tracebacks

The following sequence reliably produces an error (running zeroein on Emacs 23):

  1. Type for i in xrange(10): in an empty cell.
  2. Press Enter.
  3. Press Tab.

No tab is inserted, the cursor leaves the cell, and the following traceback is produced:

part 2 [python-mode]: chu-min=32 chu-max=33 chu-last-bol=nil
apply: Wrong length inserted in mirror [python-mode]: change-beg=10 part=3, chu-max=33, pm=34
Toggling font-lock-mode off; better pass an explicit argument.

EIN menu

Is an EIN menu planned? I think a menu would help users to explore the various commands in the EIN package.

Url encoding error gives a 404 for ein:notebooklist-open

In emacs using

python zeroein/zeroein.py --emacs `which emacs-snapshot`

I get this:

Contacting host: 127.0.0.1:8888
ein: [error] Error (error) while opening notebook list at the server 8888.
Contacting host: 127.0.0.1:8888

The terminal running ipython notebook reports

WARNING:root:404 GET /notebooks%3f_%3d1341211357 (127.0.0.1) 0.43ms

Interestingly if I decode the url and go to http://127.0.0.1:8888/notebooks?_=1341211357 in my browser I get the json response that I assume ein is expecting:

[{"name":"test","notebook_id":"1c7fc74f-4037-4f47-823e-ef6fbea4d5c9"}]

emacs version: GNU Emacs 24.1.50.1
ipython version: 0.13.dev

Pressing tab twice to deident sometimes causes error from MuMaMo

Enter the following in code cell ([] is the cursor position) then hit TAB twice:

def f():
    pass
    []

causes the following error:

part 2 [python-mode]: chu-min=34 chu-max=35 chu-last-bol=nil
apply: Wrong length inserted in mirror [python-mode]:
change-beg=10 part=3, chu-max=35, pm=36

See also:

Reconnect to new server instance

It should be possible to reconnect to different server/notebooks. Reconnecting to different notebook is effectively as same as "Save as" functionality.

Rethink how EWOC is used for stream output area

By 6f3fb3b, I started using (comint-carriage-motion START END). This function removes character of the outside of the given region if the START point is not at the beginning of line. This probably causes something wrong in EWOC side because this means comint-carriage-motion may remove some characters from previous EWOC node.

Possible fix is to treat continuous output stream as one EWOC node, like what HTML client in IPython does.

Repo organization

Two notes on the repo:

  • No COPYING or LICENSE file included, and it's not mentioned in the readme. Personally I'd love it if you could license it BSD as the rest of IPython, but it's your choice (or not, if you have GPL dependencies). In any case, you should have a license file and put a note of what the license is in the readme.
  • I suggest you move all the top-level code into a subdir, so the main repo is a smaller directory with just the README, LICENSE and other necessary top-level files, plus subdirs.

Connecting to EIN Notebook with password security...

When I attempt to connect to a notebook with password security, I receive an error.

Are notebooks with password security (set up using ipython config variable c.NotebookApp.password) accessible with EIN?

Thanks.

mumamo compatibility problems with emacs-for-python

Hi! I'm the mantainer of https://github.com/gabrielelanaro/emacs-for-python I'd really like to make my package compatible with ein.

Right now I'm having problems setting ein up, what I obtain is an "invalid file name" error message my mumamo when I open a notebook and head over a cell. The problem disappears when i manually load python-mode.

the relevant part of the initialization file is something like this:

(load-file "~/workspace/emacs-for-python/epy-init.el")

(add-to-list 'load-path "~/workspace/emacs-websocket/")
(add-to-list 'load-path "~/workspace/emacs-ipython-notebook/")
(add-to-list 'load-path "~/workspace/ein/zeroein/markdown-mode/")
(require 'markdown-mode)
(load-file "~/workspace/ein/zeroein/nxhtml/autostart.el")
(require 'ein)

If you comment emacs-for-python loading all is ok. I suspect this is something related to other things that gets loaded with python-mode (rope, other stuff..). There's a way I can disable them when loading python-mode in the mumamo environment?

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.