Giter Site home page Giter Site logo

lhl2617 / vslilypond Goto Github PK

View Code? Open in Web Editor NEW
91.0 7.0 7.0 26.98 MB

VSCode Extension for LilyPond

Home Page: https://marketplace.visualstudio.com/items?itemName=lhl2617.vslilypond

TypeScript 100.00%
lilypond vscode midi formatter lilypond-extension midi-playback intellisense autocomplete vscode-pdf-previewer

vslilypond's Introduction

VSLilyPond

Visual Studio Marketplace Visual Studio Marketplace Visual Studio Marketplace

Provides syntax and error highlighting, IntelliSense and AutoComplete, compilation on save, MIDI (input and playback) support for LilyPond in VSCode. Works with any VSCode supported PDF previewer for PDF preview.

See docs/INSTALL.md for a setup guide.

Features

Error highlighting ๐Ÿ“œ

Error highlighting

IntelliSense and AutoComplete ๐Ÿ’ก

IntelliSense and AutoComplete

Compilation on save ๐Ÿ’พ

Compilation on save

MIDI Input ๐ŸŽน

MIDI Input Supports chord mode, relative mode and sharp/flat accidentals. See DEMOS.md for advanced features in action, and SETTINGS.md on how to toggle them.

MIDI Playback ๐ŸŽผ

MIDI Playback

Two-way Point and Click ๐Ÿ“„

Forward (Score to PDF)

Forward Point-and-Click

Backward (PDF to Score)

Backward Point-and-Click

See here for more information (including a usage guide).

Requirements

See docs/INSTALL.md for a setup guide.

  • VSCode 1.46.0 minimum
  • LilyPond (Tested on 2.22.1)
  • (Optional) MIDI Devices for MIDI Input and Playback
  • (Optional for Windows, Linux and macOS users) python-ly: Required for formatting (more information here)

Extension Controls, Commands and Settings

Issues & FAQ

Please submit issues in the GitHub repository.

See the FAQ at docs/FAQ.md.

Contributing

Development

Requirements

Setup

  • Clone repository

    git clone https://github.com/lhl2617/VSLilyPond
  • Install npm dependencies

    npm i
  • Hit F5 to run an Extension Development Host.

    See here for a detailed extension development guide.

Testing MIDI input

  • On Windows, download VMPK and loopMIDI. These will allow you to test with a virtual MIDI keyboard.

Releasing

Releasing is done automatically via GitHub Actions. Bump the version in package.json and update CHANGELOG.md before merging into the default branch.

Acknowledgements

Base syntax highlighting depends on the LilyPond Syntax extension by Alexis Jeandeau, under the Creative Commons Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) license (http://creativecommons.org/licenses/by-sa/3.0/). See that repository for additional acknowledgements.

IntelliSense and AutoComplete depends on the LilyPond AutoComplete (Commands & Keywords) extension, under the MIT license.

Formatting depends on the LilyPond Formatter extension, under the MIT license.

Point and Click depends on the LilyPond PDF Preview extension, under the MIT license.

License: Creative Commons Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) license, http://creativecommons.org/licenses/by-sa/3.0/.

vslilypond's People

Contributors

code-factor avatar dependabot-preview[bot] avatar dependabot[bot] avatar imgbotapp avatar lhl2617 avatar paradox460 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

vslilypond's Issues

Documentation for MIDI setup?

I'm on Ubuntu.

I found https://hymnsinger.com/vscode, which links to https://hymnsinger.com/contributing#audio-playback, which links to https://github.com/frescobaldi/frescobaldi/wiki/MIDI-playback-on-Linux and https://github.com/frescobaldi/frescobaldi/wiki/MIDI-playback-on-Mac-OS-X.

Following those instructions, I managed to get fluidsynth up and running (it can play a MIDI file generated by saving a .ly in VSLilyPond), but VSCode still says Error: No output MIDI devices are found., and no devices appear in the list for input or output.

This request is in 2 parts:

  1. In the documentation, it might be useful to at least point at those frescobaldi resources for getting MIDI set up on linux and OSX, or even better add a walkthrough for different OSes.
  2. Do you have any advice for how to get my instance working?

Thanks for this excellent extension!

[MIDI] Feature suggestion: remember last-used playback offset

When writing or debugging a score, it's useful to use the MIDI playback feature to start from a specific point. When working on a particular section, it would be useful if the "Play from..." command remembered the last time offset used and provided it as a default. It can also be pre-selected, so that if the user wanted to enter a new offset, they could just start typing and it would erase the previously used offset.

Proposed scenario

Suppose I am working on a section 1 minute and 2 seconds into the piece.

  1. I run "MIDI Playback: Play from..."
  2. The time offset input dialog appears, with no current value
  3. I enter "1:02" and hit enter
  4. the MIDI score plays from 1:02
  5. I made some changes to that section of the score
  6. I run "MIDI Playback: Play from..."
  7. The time offset input dialog appears, with the value "1:02" already entered and selected
  8. I hit "enter"
  9. The MIDI score plays from 1:02
  10. Satisfied with this section, I start working on an earlier section and make some changes
  11. The time offset input dialog appears, with the value "1:02" already entered and selected
  12. I enter "0:33" and hit enter
  13. The MIDI score plays from 0:33

Point-and-click on score?

I'm wondering if something like Frescobaldi's point-and-click functionality could be added, wherein a user can click on an element in the PDF score and have the mark jump to the corresponding place in the LilyPond code. (I see the LilyPond docs mention a lilypond-invoke-editor command?)

Compilation fails with Chinese titles

Here is what I've got in output log:

Compiling: /Users/King/Documents/lilypond/chunxiaoyin.ly
Fontconfig warning: "/usr/local/etc/fonts/fonts.conf", line 86: unknown element "blank"

Fontconfig warning: "/usr/local/etc/fonts/fonts.conf", line 86: unknown element "blank"

Backtrace:
18 (apply-smob/1 #<catch-closure 10a955c00>)
In ice-9/eval.scm:
293:34 17 (_ #(#(#<directory (lily) 10a95ef00>) #<variable 10c4?>))
619:8 16 (_ #(#(#(#(#(#(#<directory (lily) 10a95?>) ?) ?) ?) ?) ?))
In srfi/srfi-1.scm:
640:9 15 (for-each #<procedure 10c432240 at ice-9/eval.scm:333:?> ?)
In ice-9/eval.scm:
619:8 14 (_ #(#(#(#(#<directory (lily) 10a95ef00> #f # ?) ?) ?) ?))
In ice-9/boot-9.scm:
829:9 13 (catch _ _ #<procedure 10c435820 at ice-9/eval.scm:386?> ?)
In unknown file:
12 (ly:parse-file "/Users/King/Documents/lilypond/chunxiao?")
11 (ly:book-process # #< Output_def> #< Output_def> #)
In ice-9/eval.scm:
619:8 10 (_ #(#(#(#(#(#(#(#(#(#(#(?) ?) ?) ?) ?) ?) ?) ?) ?) ?) ?))
619:8 9 (_ #(#(#(#<directory (scm framework-ps) 10cdf3aa0>) ?) ?))
159:9 8 (_ #(#(#(#<directory (scm framework-ps) 10cdf3aa0>) ?) ?))
293:34 7 (_ #(#(#(#(#(#(#<directory (scm frame?> ?) ?) ?) ?) ?) ?))
In srfi/srfi-1.scm:
592:29 6 (map1 ((#<Font_metric ("emmentaler-20" . 0.569055?> ?) ?))
592:17 5 (map1 ((#f "HiraKakuProN-W4" "/System/Library/Fon?" ?) ?))
In ice-9/eval.scm:
159:9 4 (_ #(#(#(#(#(#(#(#<directory (scm ?> ?) ?) ?) ?) ?) ?) ?))
279:15 3 (_ #(#(#(#(#(#(#(#<directory (scm ?> ?) ?) ?) ?) ?) ?) ?))
159:9 2 (_ #(#(#(#<directory (scm framework-ps) 10cdf3aa0>) ?) ?))
155:9 1 (_ #(#(#(#<directory (scm framework-ps) 10cdf3aa0>) ?) ?))
In unknown file:
0 (stat "/System/Library/Fonts/??????????? W4.ttc" #<unde?>)

ERROR: In procedure stat:
In procedure stat: No such file or directory: "/System/Library/Fonts/??????????? W4.ttc"

Compilation failed

Compilation successes if I just use lilypond command to compile:

GNU LilyPond 2.22.1 (running Guile 2.2)
Fontconfig warning: "/usr/local/etc/fonts/fonts.conf", line 86: unknown element "blank"
Fontconfig warning: "/usr/local/etc/fonts/fonts.conf", line 86: unknown element "blank"
Processing `chunxiaoyin.ly'
Parsing...
Interpreting music...
Preprocessing graphical objects...
Finding the ideal number of pages...
Fitting music on 1 page...
Drawing systems...
Converting to `chunxiaoyin.pdf'...
Success: compilation successfully completed

Measure display in MIDI Player

I find the measure display in the MIDI player in Frescobaldi extremely useful. Would it be possible to have something like that?

image

Upgrade dependencies to include jazz-midi 1.7.3

I was trying the midi input feature, and I found that only the occasional keypress was being recognized by VSLilyPond. After some troubleshooting, I found that this was a problem in the jazz-midi package used by JZZ: jazz-soft/JZZ#26 (comment). It was recently fixed in 1.7.3. I forced an upgrade in my install of VSLilypond, and all keypresses are now registered.

MIDI input is not debounced

I am using a KORG microKEY AIR (bluetooth 25key midi keyboard) on MacOS 10.15.7, and when attempting to input notes, I get a "double note" effect. Pressing the key gets one note entered into the document, but releasing it gets the same note.

Additionally, there is some carry-over from previously entered notes.

Screenshot 2021-09-03 at 15 27 12

Bumping jzz-midi-smf from 1.5.0 to 1.6.2 causes extension publishing failure due to virus scan

LilyPond expects file argument

After following the recommended setup for LilyPond, no features within VSLilyPond work.

I am using OSX and installed LP:

  1. Ran brew install lilypond.
  2. Confirmed running lilypond worked.
  3. Reloaded VS.

I created a basic test.ily (also a .ly equivalent to check) file: { c }

Immediately in VS console I see an error: Intellisense failed with error TypeError [ERR_INVALID_ARG_VALUE]: The argument 'file' cannot be empty. Received ''

Compiling fails for the same reason.

How do you auto reload pdf after compiling?

I was able to compile the test.ly by pressing command+s on my Mac and it generate a test.pdf file, I open this pdf file in a split window on vscode.
image

As you known, we need to repeat this procedure: write codeโ†’save(compile)โ†’preview, but I can't do this, every time I save(compile) the test.ly file, the test.pdf file not auto reloading, I have to close it and reopen to see the change.

How can I solve this problem?

vslilypond

v1.7.3

vscode

Version: 1.62.3 (Universal)
Commit: ccbaa2d27e38e5afa3e5c21c1c7bef4657064247
Date: 2021-11-17T07:59:13.865Z (2 wks ago)
Electron: 13.5.2
Chrome: 91.0.4472.164
Node.js: 14.16.0
V8: 9.1.269.39-electron.0
OS: Darwin x64 20.6.0

macOS

Big Sur 11.5.1 (20G80)

How am I supposed to install lilypond?

I'm sorry to bother you with this one...

I can't find any prescription on how to install lilypond in order for VSLilyPond to work as expected.

(I'm on macOS 10.15.4.)

Many TIA.

kN

Error "\maininput not allowed outside init files" when starting the extension

I get the following error (in the "Problems" tab) when I try to edit a lilypond file:

[{
	"resource": "/C:/Users/Gustav/scoop/apps/lilypond/current/share/lilypond/2.24.3/ly/init.ly",
	"owner": "_generated_diagnostic_collection_name_#2",
	"severity": 8,
	"message": "Guile signaled an error for the expression beginning here",
	"startLineNumber": 65,
	"startColumn": 1,
	"endLineNumber": 65,
	"endColumn": 2
}]

[{
	"resource": "/C:/Users/Gustav/scoop/apps/lilypond/current/share/lilypond/2.24.3/ly/init.ly",
	"owner": "_generated_diagnostic_collection_name_#0",
	"severity": 8,
	"message": "\\maininput not allowed outside init files",
	"startLineNumber": 46,
	"startColumn": 1,
	"endLineNumber": 46,
	"endColumn": 1
}]

The lilypond command works fine from the command line. This is a copy of lilypond installed using the scoop package manager, if it matters (not that I can see why it should).

Cannot play MIDI file from VSLilyPond

I've read the FAQ.
Midi output is well generated (works like a charm with Frescobaldi or lilypond itself)

Problem:
Currently, MIDI file extension is hardcoded to .mid in file https://github.com/lhl2617/VSLilyPond/blob/master/src/midiOut.ts#L90
By default, lilypond will use .midi, except for Windows:

(midi-extension ,(if (eq? PLATFORM 'windows)
                     "mid"
                     "midi")

Possible solutions:

Guile reports error in init file

I have the extension working on Mac but despite generate the midi and pdf files correctly, every time I compile it shows this error:

Guile signaled an error for the expression beginning here
\maininput not allowed outside init files

The \maininput statement is inside an init.ly file:

/opt/homebrew/Cellar/lilypond/2.24.2/share/lilypond/2.24.2/ly/init.ly

I'm using:

  • vscode
Version: 1.77.0 (Universal)
Commit: 7f329fe6c66b0f86ae1574c2911b681ad5a45d63
Date: 2023-03-29T09:57:11.797Z
Electron: 19.1.11
Chromium: 102.0.5005.196
Node.js: 16.14.2
V8: 10.2.154.26-electron.0
OS: Darwin arm64 22.5.0
Sandboxed: Yes
  • lilypond
% lilypond --version
GNU LilyPond 2.24.2 (running Guile 3.0)

Copyright (c) 1996--2023 by
  Han-Wen Nienhuys <[email protected]>
  Jan Nieuwenhuizen <[email protected]>
  and others.

This program is free software.  It is covered by the GNU General Public
License and you are welcome to change it and/or distribute copies of it
under certain conditions.  Invoke as `lilypond --warranty' for more
information.
  • VSLilyPond v1.7.3

Handle "concurrent" compilation jobs

#252 (comment)

I deliberately made it so that there is only 1 max compilation job running, but eh--nothing stops us

  • either killing the previous process and letting the newest one take over; or
  • allowing concurrent compilation jobs to run

I'm in favour of the former to conserve computing power.

Publish VSLilyPond to Open VSX

Dear extension author,
Please publish this extension to the Open VSX marketplace.

Context

Unfortunately, as Microsoft prohibits usages of the Microsoft marketplace by any other products or redistribution of .vsix files from it, in order to use VS Code extensions in non-Microsoft products, we kindly ask that you take ownership of the VS Code extension namespace in Open VSX and publish this extension on Open VSX.

What is Open VSX? Why does it exist?

Open VSX is a vendor neutral alternative to the MS marketplace used by most other derivatives of VS Code like VSCodium, Gitpod, OpenVSCode, Theia-based IDEs, and so on.

You can read on about Open VSX at the Eclipse Foundation's Open VSX FAQ.

How can you publish to Open VSX?

The docs to publish an extension can be found here. This process is straightforward and shouldn't take too long. Essentially, you need an authentication token and to execute the ovsx publish command to publish your extension. There's also a doc explaining the whole process with an example GitHub Action workflow.

improve format tool

As I understand, current format tool is the same as exists in https://github.com/frescobaldi/python-ly/blob/master/ly/reformat.py

I lack the possibility to keep reasonable line width, and making line-breacks in obvious places.

Currently, I've made quick format function for my Reaper lilypond exporter, so I pretty like how it looks like on simple generated code, but it is not as flexible as the original module.

import re
import textwrap

def format_lines(lilypond: str) -> List[str]:
    patterns = {
        re.compile(r'<<(?!\n)'): '<<\n',
        re.compile(r'{(?!\n)'): '{\n',
        re.compile(r'(?!\n)>>'): '\n>>',
        re.compile(r'(?!\n)}'): '\n}',
        re.compile(r'(?=\s)\|(?=\s)'): '|\n',
    }
    idents = re.compile(r'(<<)|{')
    dedents = re.compile(r'(>>)|}')
    for pattern, repl in patterns.items():
        lilypond = re.sub(pattern, repl, lilypond)
    lines = re.split(r'\n', lilypond)
    out = []
    ident = 0
    ident_am = 4
    for line in lines:
        line = line_strip(line)
        if m := re.search(dedents, line):
            ident -= 1
        # if line:
        ident_str = ' ' * ident
        ident_level = ident_str * ident_am
        wraped = textwrap.wrap(
            line,
            width=80 - len(ident_level + ident_str),
            subsequent_indent=ident_level + ident_str,
            # initial_indent=ident_level
        )
        out.append(ident_level + '\n'.join(wraped))
        if m := re.search(idents, line):
            ident += 1
    return out

Scheme syntax highlighting

Thanks for the great extension!

Would it be possible to add support for Scheme syntax (in between #( and )) and comments (in between #! and !#)?
I'm not sure how to do that myself, but I'm willing to contribute if necessary.

Extension can't get current workspace folder path

Hi, thank you for making this wonderful software :)

I'm working on a piece that uses three .ly files (Lyrics.ly, Melody.ly, Score.ly), where Score.ly is the main compilation file and includes the other two within it. I want it so that when I edit any of the three files, Score.ly is the one that gets compiled. In settings, I checked the box for "Compile Main File On Save" and added Score.ly in the Path To Main Compilation File text box.

However, with these settings, I get the following error message upon saving any of the three files:

Compilation failed: Unable to find main file to compile: unable to get workspace folder path of the currently active text document

I've tried running in administrator mode, and I poked around the general VSCode settings, but beyond that I'm not really savvy enough to know what's going on.

statusBar commands stop working

Since the namespace change in cf9a8bb, the statusBar shortcut stop working, since they are still using extension.playMIDI ...

Renaming them to vslilypond.playMIDI... in src/miniIn.ts and src/miniOut.ts will fix the issue.

MIDI output not sounding (Ubuntu Linux)

I seem unable to get the MIDI playback to work on Linux. I've started Timidity (with 'timidity -iA -0s'), and in Code set the output device to 'TiMidity port 0,' but when I click Play MIDI the timer counts to the end of the file without producing any sound. I have tested the MIDI file from the command line and it works there.

Could not pull "Apple DLS Synth" or "Network Session 1" to set Midi Input and Playback on "Big Sur"

It was all good on Catalina. But when I tried VSLilyPond on a new MacBook Air with Big Sur, in either MIDI Playback or MIDI Input, the list is empty.

The built-in Apple DLS Synth would be a good, quick way to test out the music without depending on an external MIDI device.

For the "Network Session 1", I am using expressionPad as the MIDI controller / pad. It works great with GarageBand on both Catalina and Big Sur. And on the Catalina, in VSLilyPond, the expressionPad works great for the MIDI Input. However, it doesn't work for VSLilyPond on Big Sur.

I'm not sure whether upgrading the JZZ library to the latest version would help. But it might worth trying. Thanks

Sunsetting (but replacing!) the VSLilyPond suite

I started this project back about more than one year ago just as a fun little project to augment my LilyPond editing experience--I am a die-hard VSCode fan, and wanted to bring conveniences that Frescobaldi etc. brought to the table to VSCode.

I never realised that it'd actually be a tool used by actual people--there's a StackOverflow question about it, @kenakofer wrote a really nice guide for setting it up, and it has made its way into the lilypond-user mailing list.

Now, I do not intend to stop developing this! I in fact have more ideas on how to make VSLilyPond even better. Here's the catch however:

I developed VSLilyPond under my university Microsoft account, and due to a four-year-old issue that Microsoft doesn't even bother to ack, I will need to deprecate and replace this suite of extensions under a different publisher.

Deprecation will happen in June, and the replacement will likely be made over the summer in 2021, but as I'll be graduating (and joining Facebook), there'll be some complications, delays, etc.--no promises!

This is also a great chance for me to use better dev practices etc.--couple of
points for the plan will be

  • Monorepo for VSCode extension
    Developing this suite of extensions under many repos isn't really nice IMO, there's some code duplication, especially in the deployment processes, that I'd love to get rid off. Having just one extension depending on nothing is much nicer, and bugs and issues can just be linked to one extension. I expect to continue relying on https://github.com/jeandeaual/vscode-lilypond-syntax however.
  • Editor-agnostic LSP
    LSPs are "the thing" for language support in editors. It would be much better if an LSP server is written for LilyPond. It can still depend on the local LilyPond (+Python-ly) installation, but the best thing is that devs wanting to code LilyPond in another LSP-enabled editor (pretty much every good editor these days) could just use (and contribute to) the common LSP. This model has worked extremely well for gopls, which connects seamlessly to the official VSCode Go extension
  • Better documentation
    LilyPond users may not necessarily be tech wizards capable of digging very technical docs out, so clearer and better documentation would help everyone. The biggest pain point is--as suggeested by the StackOverflow question above--setting it up. I'd commit to write clearer documentation, especially when errors occur. An example would be linking to a installation guide on the error inside VSCode if something wasn't set up wrongly.
  • Better tests
    Tests currently do not run end-to-end on intellisense etc.--the atom version of the extension does: https://github.com/nwhetsell/linter-lilypond

Thanks for using and supporting VSLilyPond :)

MIDI file playing in a devcontainer

I usually work inside a development container, and this extension works perfectly fine there, except for the MIDI file player: I get no error but no music is played.
I tried installing timidity, fluid-soundfont-gm and fluid-soundfont-gs, but this didn't help (the container is based on Debian).

Here is the configuration I use (files inside .devcontainer):

  • Dockerfile:

    # [Choice] LilyPond version: 2.22.0, 2.23.0, etc.
    ARG VARIANT="2.23.0"
    FROM jeandeaual/lilypond:${VARIANT}
    
    ARG USERNAME=vscode
    ARG USER_UID=1000
    ARG USER_GID=$USER_UID
    
    RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false update && export DEBIAN_FRONTEND=noninteractive \
            && apt-get -y upgrade \
            && apt-get -y --no-install-recommends install sudo git vim timidity fluid-soundfont-gm fluid-soundfont-gs \
            && rm -rf /var/lib/apt/lists/*
    
    RUN groupadd --gid "${USER_GID}" "${USERNAME}"
    RUN useradd -s /bin/bash --uid "${USER_UID}" --gid "${USER_GID}" --groups sudo --create-home "${USERNAME}"
    RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
    
    RUN printf '\nexport LANG="C"\nexport LANGUAGE="C"\nexport LC_ALL="C"\n' >> "/home/${USERNAME}/.bashrc"
  • devcontainer.json

    {
        "name": "LilyPond",
        "build": {
            "dockerfile": "Dockerfile",
            // Update 'VARIANT' to pick an LilyPond version: 2.22.0, 2.23.0, etc.
            "args": { "VARIANT": "devel-fonts" }
        },
        // Add the IDs of extensions you want installed when the container is created.
        "extensions": [
            "lhl2617.vslilypond",
            "tomoki1207.pdf"
        ],
        // Connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
        "remoteUser": "vscode"
    }

Do you have any idea how to make it work?

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.