Code Monkey home page Code Monkey logo

dspdfviewer's Introduction

Dual-Screen PDF Viewer for latex-beamer

Build Status

This is a simple viewer for latex-beamer presentations that are built with the show notes on second screen option of latex-beamer.

It will take your PDF file, split it in a left and right half and render the two halves individually to the screens.

Usage

There is a manpage included that explains all the options and keybindings. Most important ones are probably:

Command line:

dspdfviewer [options] pdf-file

where the most useful option is probably -f, because it enables you to use the software with a standard pdf (i.e. not specifically built for latex-beamer).

In-Program-Controls:

Left/Right, Mouse Buttons or Mouse Wheel: Back/Forward

S or F12: Swap screens (if you see the wall clock on the projector)

B or . (period): blank/unblank audience screen

Q/Esc: Quit

Installation

Please read the installation section on the project's website for detailed instructions, broken down by operating system.

For generic from-source installation instructions, you can also consult the INSTALL file.

dspdfviewer's People

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

dspdfviewer's Issues

Separate presenter navigation

I've never used Qt, so I don't know how feasible this is, however...

It would be awesome to be able to hit some hot-key and enter a mode where I could use the arrows to navigate along the pre-rendered strip at the bottom. I could then hit ENTER to jump directly to that slide, or escape to go back to normal mode.

Create a framework for automated testing

It would be nice to have some kind of automated testing facility. Right now the only mistake that can be automatically detected is "failed to compile", meaning mostly syntax- or type-errors.

I'm thinking about something along the lines of

  • Create a in-memory xinerama with two Xvfb or similar, in different screen sizes
  • Creating set of PDFs that contain mostly colored areas
  • Load dspdfviewer, send it a set of keypresses and then make a screenshot and inspect certain pixel's color

If anyone has better ideas how one could test at least some basics, please share.

Don't show "loading slide" on presentation screen

If one navigates quickly through the slides (eg by using a hyperlink which points to a slide far away), it takes a moment until the slide is shown. In this time, a black screen with an information text that the slide is being loaded is presented. This is perfectly fine for the internal view; however, the presentation screen should still show the old slide until the new one is ready to be displayed.

Show presentation and notes at the same time

It can be very useful to see the same slide as the audience does on the own screen while the notes are also visible right to it (so the internal view shows the presentation as any normal reader would do). People with a small screen might not like this, but for those with a larger one with high resolution, it can be very useful.
I think 'd' for duplicate might be a good key to switch between the views.

Regression: Both windows spawn on primary monitor

Platform: Debian Sid/Openbox/Qt5

Git Revision: d2945f8 Merge remote-tracking branch 'projekter/push'

When compiling in Qt5 mode, both windows spawn on the primary screen on top of each other and do not move. The S key re-renders them, but their positions do not change.

Swapping screens does not work on kubuntu 13.10

This bug was found by @cfigura.

Steps to reproduce:

  • Run dspdfviewer on Kubuntu 13.10 (a virtual machine with 2 monitors works fine)
  • Press s or F12

Expected / documented behaviour:

  • Primary and secondary window swap screens

Actual Response:

  • Some flickering, but the windows stay on the same screens

Known Workaround:

  • Define the projector as "primary" display before starting dspdfviewer, the windows start on the correct screens; However they still cannot be switched.

Regression: Changing slide with disabled audience screen crashes program

Reproducible: Always

How to:

  • Load presentation with at least 2 slides (the demo presentation will do)
  • Blank audience screen (B or .)
  • Press next slide (N)

Crash at hyperlinkarea.cpp:32

Backtrace:

#0  0x00007ffff6475dbd in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#1  0x0000000000434114 in HyperlinkArea::HyperlinkArea (this=0x869090, imageLabel=0x7123c0, link=...)
    at /home/edel_danny/git/dspdfviewer/hyperlinkarea.cpp:32
        mySize = {x1 = 0, y1 = 0, x2 = -1, y2 = -1}
        pixmap = 0x0
        sizeWithinImageLabel = {xp = 6.9533558071069492e-310, yp = 2.1774021425090619e-317, w = 6.9533292891721323e-310, 
          h = 6.9533292884891359e-310}
#2  0x000000000044aa70 in PDFViewerWindow::parseLinks (this=0x7fffffffdd18, links=...)
    at /home/edel_danny/git/dspdfviewer/pdfviewerwindow.cpp:486
        linkGoto = @0x7fffe001f0e0: <incomplete type>
        linkArea = 0x778bb26a02ed2b00
        rect = @0x7fffffffc740: {xp = 0.70776011562286745, yp = 0.93838745524138789, w = 0.017638881386239702, 
          h = 0.031749951493129647}
        type = @0x7fffffffc78c: Poppler::Link::Goto
        link = @0x84c470: {m_link = {<QtSharedPointer::ExternalRefCount<Poppler::Link>> = {<QtSharedPointer::Basic<Poppler::Link>> = {
                value = 0x7fffe001f0e0}, d = 0x7fffe001bae0}, <No data fields>}, ri = {thePageNumber = 1, thePagePart = LeftHalf, 
            theRequestedPageSize = {wd = 1280, ht = 1024}, theVersion = 0}}
        __for_range = @0x7fffffffc8e0: {{p = {static shared_null = {ref = {_q_value = 351}, alloc = 0, begin = 0, end = 0, 
                sharable = 1, array = {0x0}}, d = 0x16bd940}, d = 0x16bd940}}
        __for_begin = {i = 0x16bd958}
        __for_end = {i = 0x16bda10}
        linkAreas = {{p = {static shared_null = {ref = {_q_value = 351}, alloc = 0, begin = 0, end = 0, sharable = 1, array = {0x0}}, 
              d = 0x667780 <QListData::shared_null>}, d = 0x667780 <QListData::shared_null>}}
#3  0x0000000000449c9c in PDFViewerWindow::renderedPageIncoming (this=0x7fffffffdd18, renderedPage=...)
    at /home/edel_danny/git/dspdfviewer/pdfviewerwindow.cpp:299

start a desktop application

it would be nice if there is a possibilty to start a desktop app (like a browser) and than switch back to the presentation.

Start audience window on "secondary" screen

This idea came while thinking about the workaround at #6.

Normally, people will have their laptop's screen defined as "primary" (screen 0) and the projector as "secondary" (screen 1).

Yet, dspdfviewer spawns the "audience" window on the primary screen, and the "presenter" window on the secondary screen.

This behaviour is specified in the constructor arguments in dspdfviewer.cpp and

Just swap it around and it should feel more natural.

Show program version in F1 popup

In case calling --version is inconvenient or impossible (see #99 for an example), users should still be able to see the version number.

Embed the version number into the F1 (keybindings) quick-help.

Feature request:Key binding to pause the timers

In rehearsals it is very common to stop and note something down or start a short discussion. In such cases it would be nice to be able to pause the timers so the measured time will reflect the actual presentation time.

'p' would be a nice fit but is already taken.

Verify build works on Mac OS and update installation instructions

@wwwdata created the initial Mac OS installation instructions using the macports system. However, in the meantime the brew system emerged.

@wwwdata, please verify that building on current MacOS with the brew system, and - if possible - include this project in their database for easy installation.

btw, I can only assign tickets to myself or nobody. Can you click assign to yourself on this ticket?

Change library version name

Compiling DS PDF viewer with the recent changes in cmake structure fails, because the new library is called the same as the application itself (VC++ always creates a .lib file when building the .exe - so the linker tries to include dspdfviewer.lib and build this file at the same time in the same directory, which cannot work).
In my settings, I have changed the .lib's name to libdspdfviewer.lib to solve this conflict. Another possible solution would result in putting the library to a different directory.

Countdown for presentation / slide-time

Make a command-line switch or configuration file option for time per slide and/or time for the whole presentation.

Then change the presentation-clock / slide-clock to a countdown and somehow visualize the user being overtime (i.e. red letters)

Add support for external URL Hyperlinks

Currently only go-to-page-X style hyperlinks are supported.

It would be nice if dspdfviewer would also support hyperlinks of the http://example.com variety.

More intuitive way to specify booleans on the command line

This is a split from #8

Originally suggested by @mmonaco on 2013-11-16, quoting:

But really, if you want to do any options parsing work, having to specify true/false for the boolean options is annoying. -t -w -p and -s should just mean the opposite of the default.

You could have e.g.,

-w --no-wall-clock
-W --wall-clock
  Hide or show the wall clock (default, show the wall clock).

-p --no-presentation-clock [<time>]
-P --presentation-clock [<time>]
  Hide or show the presentation clock (default, show the presentation clock). If a time is given, the clock counts down from the specified <time> rather than up.

I'm not 100% sure if I will take over the idea exactly, but using capital letters to specify the opposite, or using a --no- prefix in long options seems reasonable.

'b' typically means blank monitor

Right now, 'b' is matched with 'p' for back and previous. How important is this to you? 'b' seems to be standardized on blanking the monitor, so it would be nice if it blanked just the audience screen.

Note that most of the presentation remotes I've seen actually have a button which sends 'b' just for this purpose.

Support for Logitech R400 Presenter

I use the Logitech R400 Presenter for presentations and have searched long for a software like yours. Thanks for the work!
One little extension would be really nice.
If you could add "." as a second command to blackout the audience screen.
Then all buttons of the R400 would work as labeled.
To end the presentation you can double click on the start button.

DSPDFViewer : Both windows of presentation spawning on the same screen

I was trying to use dspdfviewer on windows for presentation made using LaTex. I have placed second screen on right. It opens two different windows, one for the presentation and one for notes. i have also extended the displays with my laptop screen on the right and projector screen on the left. However, both screens appear on my right screen, i.e., my laptop screen and i cannot move the main presentation to the projector screen. Important details are

  1. OS : Windows7
  2. Version: v1.13-218-g83eb2d8
  3. Installed from @projekter's setup.exe

Refactor CMakeLists spaghetti file into smaller units

The file is completely unreadable by now.

It has at least the following parts, and could be split into smaller files named something like those:

  • Set options
    • These probably make sense in the top-level CMake, since distributors will read this first
  • Find dependencies (boost, qt4 / qt5)
  • Set variables (mainly source file lists)
    • This could be left in top-level aswell
  • Set compiler flags (include dirs, errors/warnings...)
    • Clang
    • GCC
  • Set program version number
  • Set installation paths
    • This also makes sense in top-level

Help needed: MacOS quality assurance

Mission: Make the program have the same release quality on MacOS that it does on Linux.

This will require at least one of

  • A person with a Mac that helps with creating testcases/fixing regressions
  • Access to a Mac (virtual) machine (with two screens connected) for myself.

Any takers?

Distribution packages outdated / How to coordinate new releases?

Hello @kd35a,
Hello @jeeger,

first of all thanks again for helping me with the packaging. I've programmed a bit more since you included dspdfviewer in gentoo and arch and it has a few new features.

I've also done a bit of restructuring and moved (I used git commit --author to commit your lines, I hope thats ok) system-specific installation instructions into the gh-pages branch (which results in a rendered website) to reduce clutter in the sourcecode. While moving, I noticed that the distribution-specific installation instructions may be outdated (at least the gentoo link points to 404). If you could help by checking and - if necessary - updating the instructions, that would be awesome.

However, it's a problem is that we never agreed on a way on how to coordinate new releases. This also applies to @projekter, who succeeded at building windows (!) binaries of dspdfviewer.

I believe the new features added (especially the hyperlinks, and the file-chooser-window when started without a command-line-parameter) justify creating a v1.13 within the next few days. I'd appreciate your help in establishing some kind of "a new release is there" protocol, so this stable release gets propagated to all distributions the software already has a package in.

Please post your ideas here, I hope we can figure something out. (Remember, this is my first-ever open source project, so its all new land for me too and I'm glad to be pointed out to mistakes.)

Feature request: Support for embedded media

It would be nice to have the possibility to play media or follow links embedded in the document.
A small example can be found on https://www.dropbox.com/s/isefuecod62m1mo/xmpl_pres.tar.gz?dl=0
The example contains a tiny .tex file (beamer presentation) using the movie15 package to include a video file.
As mouse clicks trigger slide-changes in DS PDF Viewer, the video can not be played in the presentation.
It would be therefore nice to have a key combination to access media.

Refactor the rendering and caching backend

Main Goal: Don't use the generic QCache class, and instead provide a specialized cache to have better control over expiry

Basic Ideas (may evolve over time):

  • First and foremost: Get rid of raw pointers. I simply hate them. Make sure the cache interface is clearly defined by looking at the classes (thus enforced by the compiler), without hiding important things such as memory ownership in the documentation. (If boost has a nice cache class that meets these requirements, try that out)
    • Incoming objects ("Cache this T"):
      • const T& makes a copy, T&& and unique_ptr<T> && moves the object into the cache.
    • Cache will use shared_ptr<T> internally.
    • Outgoing objects ("Here's your T"):
      • Default should be shared_ptr<T const> clarifying that the cache may or may not have a reference to the same object and may delete it at any time and the user is not supposed to modify the returned object.
      • User can always copy the result if he wishes to modify (Should never be needed in this software)
  • Render Factory keeps jobs in a Queue (instead of directly starting Threads on every new request) and keeps tight control over which jobs are started. Try to do as much with standard c++11 (as opposed to Qt4) to ease #59.
  • Tell the render factory about the new screen sizes on resize-events, allowing the render Factory to drop all not-yet-started jobs from the queue and fill it anew.
  • Tell the render factory about changing the current display page, allowing it to drop and/or re-sort the queue.
  • Allow the queue to be sorted by some™ Priority system, prioritizing pages that are most likely to be needed next. Allow this priority system to be easily tuned in the source, once #36 is here
    • Try to include the current display page's links.
      • Check if the links can be accessed without actually rendering the page.

Upstream windows-specific source and buildsystem changes

@projekter, you have done an amazing job porting this to windows. 👍

Looking at the diff from master to your windows port, it seems there's still a few changes necessary, and I'd like to include them in upstream, blocked into #if defined ( _WIN32 ) and if ( WIN32 ) for sourcecode and cmake, respectively.

If it's not too much to ask, It would be nice if you could make a pullrequest onto master of everything I can include upstream, to make both our lives easier.

Also, it seems parts of your windows documentation are not auto-generated from the manpage, but manually written; please include them too.


Btw: Do you use any kind of automation or package management to get the dependencies, or did you work out the dependency list by hand? (If so, is there anything I can do to help automate things?)

User Input needed: Provide realistic example presentation(s) with dspdfviewer

To dspdfviewer's users:

I want to have an example presentation (in latex-source format) that contains all the things dspdfviewer already renders, as well as some real-world things it does not support yet (but probably soon will), to verify that at least it fails gracefully (ignoring content it can't render, as opposed to crashing), this is also a first step to generating a test suite for #23, although that ticket will require some more weird-looking pages aswell.

Current idea of a minimum working set (This needs feedback from users)

  • Multiple Slides
  • Table of contents
  • At least one slide that unfolds in steps
  • Many hyperlinks between the slides #35
  • Slides with embedded images

Please help with ordering the list and adding/removing things, depending on what actually is used often in real-world setups.

It would be great if the content and format of this presentation was as close as possible to real-world usage, so if you have a presentation you're allowed release into the world (since it would be added into the repository under GPLv2+) it would be much appreciated.

Customizing the thumbnails

  • In the actual version the thumbnails show the whole slide (audience slide and note slide). I think it would be more useful to show only the audience slide
  • Would it be possible so switch on and off the last, actual and next slide separately?
  • Is it possible to move the thumbnails onto the right side of the presenter screen? Maybe the actual slide thumbnail on the upper right and the next one on the lower right?

Gentoo ebuild

I've written a very dirty gentoo ebuild for installing dspdfviewer. I've already submitted it to the gentoo bugtracker, but until it gets included in the main tree, I'll put it here too, so gentoo users can install it more easily.

Note that I'm not entirely clear on the Qt dependencies: What part of Qt is required to compile dspdfviewer apart from poppler-qt4?

Also: Thanks for the software, very useful!

Transition effects

Hello,

Thanks for this great job.

I was wondering what are your thoughts about supporting some transition effects in the dspdfviewer.

I am creating this issue in an effort to start a discussion and see if this is a welcomed feature and how it could be implemented (I am not familiar with any of these).

Add "re-read PDF" support

This is a split from #12

Add a function to re-read and re-render the PDF. That includes:

  • Try re-reading the PDF. If that doesnt work, throw.
    • The user-triggered reload will probably notify the user, while the auto-reload (#12) will swallow that error.
  • Generate a unique ID of the PDF (maybe hash the header, including mod date, filesize etc) (this needs to be incorporated in the already-present PDF loader aswell)
  • Atomically do:
    • Tell the render-cache to ignore incoming renders of anything but the new unique ID
    • Clear the cache
  • If possible: Kill existing render-threads
  • Call rerender() (this will spawn necessary threads)

inotify support

I thought of another one =)

It would be nice if everything is re-rendered when the underlying PDF changes. I use this with evince a lot so I can leave the PDF open and just run make to update it.

This of course could be optional, either on or off by default.

Configurable bottom pane height

The previews of the previous and upcoming slides are nice, but almost too small to be useful. A config option to set the height, or maybe percentage of vertical space would be great.

It might also be worth considering whether the current slide needs to be listed in the prerender pane.

Infrastructure: Install auto-builders for debian wheezy and sid

Similar to the provided launchpad auto-builders there should be auto-builders for debian, especially because I am trying out sid now, but want to make sure it still compiles and runs on wheezy.

Minimum would be i386/amd64 wheezy and sid. The auto-builders should create public debian repositories so that users can easily follow daily versions.

This may be a good opportunity to try out Jenkins

Presentation clock not working

I built from git recently and I can only get two copies of the wall-time. I'm sure one of these is meant to be the presentation counter.

(@dannyedel I agree with the feature request that you submitted about count-down timers being nice, I wonder if it would even be possible to use some tex magic to submit per-slide countdown metadata).

Manual Page on Windows: Possible to view or convert to native?

@projekter, after reading #58 I was wondering how users of the windows build would read the documentation offline, since I provide it in manpage format. I remember (this may be outdated) windows software normally had chm files as manuals that would be rendered by the OS.

Is there any way to

  • Display the manpage on windows? (or)
  • Convert it into a windows-compatible-format? (Not necessary chm, I just remember many programs used that)

Moving to a monitor does not work on i3 window manager

When running dspdfviewer under i3, it cannot move to a specific monitor (both windows spawn on top of each other). I dont know if this is a bug in dspdfviewer, qt or i3, a bit of debugging will be necessary.

Temporary workaround:

Start dspdfviewer, and move the windows manually to the correct workspaces ($mod+shift+[1-9]) so that the external monitor's workspace contains the presentation.

Feature request: Key to toggle between notes and the actual slides.

When presenting some slides might come without notes, in such cases I might want to focus on the slide itself (This is possible with a bit of latex hacking). But more importantly sometimes while reading the notes I might want to focus to the slide for a second to refresh my memory about what my viewers see.

't', for toggle, might be an appropriate key.

Linux: German Umlauts printed not as UTF-8 on the console

Running a command like this on Linux console creates invalid UTF-8:

LANGUAGE=de LC_ALL=de_DE.UTF-8 ./dspdfviewer --help | tail -n5
        Dr�cken Sie F1 oder ? w�hrend der Programmausf�hrung, um einen
        kurzen �berblick �ber die verf�gbaren Tastenkombinationen zu
        erhalten.
        Bitte lesen Sie die Manpage (man dspdfviewer), um die vollst�ndige
        Liste zu erhalten.

Looking at a hexdump, it does output 0xFC (which is the correct unicode codepoint for ü), but the correct UTF-8 formatting would be 0xC3 0xBC.
I expect this is an issue with the conversion from/to std::string to integrate boost_program_options, so fix this before v1.14 gets out.

LANGUAGE=de LC_ALL=de_DE.UTF-8 ./dspdfviewer --help | tail -n5 | hexdump -C
00000000  09 44 72 fc 63 6b 65 6e  20 53 69 65 20 46 31 20  |.Dr.cken Sie F1 |
00000010  6f 64 65 72 20 3f 20 77  e4 68 72 65 6e 64 20 64  |oder ? w.hrend d|
00000020  65 72 20 50 72 6f 67 72  61 6d 6d 61 75 73 66 fc  |er Programmausf.|
00000030  68 72 75 6e 67 2c 20 75  6d 20 65 69 6e 65 6e 0a  |hrung, um einen.|
00000040  09 6b 75 72 7a 65 6e 20  dc 62 65 72 62 6c 69 63  |.kurzen .berblic|
00000050  6b 20 fc 62 65 72 20 64  69 65 20 76 65 72 66 fc  |k .ber die verf.|
00000060  67 62 61 72 65 6e 20 54  61 73 74 65 6e 6b 6f 6d  |gbaren Tastenkom|
00000070  62 69 6e 61 74 69 6f 6e  65 6e 20 7a 75 0a 09 65  |binationen zu..e|
00000080  72 68 61 6c 74 65 6e 2e  0a 09 42 69 74 74 65 20  |rhalten...Bitte |
00000090  6c 65 73 65 6e 20 53 69  65 20 64 69 65 20 4d 61  |lesen Sie die Ma|
000000a0  6e 70 61 67 65 20 28 6d  61 6e 20 64 73 70 64 66  |npage (man dspdf|
000000b0  76 69 65 77 65 72 29 2c  20 75 6d 20 64 69 65 20  |viewer), um die |
000000c0  76 6f 6c 6c 73 74 e4 6e  64 69 67 65 0a 09 4c 69  |vollst.ndige..Li|
000000d0  73 74 65 20 7a 75 20 65  72 68 61 6c 74 65 6e 2e  |ste zu erhalten.|
000000e0  0a                                                |.|
000000e1

Translation: Install translations into binary using the resource system

After #40 is merged, basic translation support is in place and work can start on using sane words in various languages, probably starting with german since there is confirmed user interest in that.

However, when loading the translations into memory their path has to be specified, which makes things a lot more complicated on various platforms.

So employ the QResource system to embed the *.qm files into the binary. This is not 100% trivial since CMake generates them in the binary dir (which makes sense to me) while Qt's resource compiler expects them in the source directory.

dspdfviewer refuses to use second display

I received my new work machine this week and recognized dspdfviewer is not working as expected anymore.
On my old machine a beamer/monitor was plugged in to a vga port and the vga-port was named VGA1 in xrandr. All i had to do is to configure my second monitor via xrandr and use dspdfviewer.
Using the new machine a beamer/monitor connected to the vga-port is named DP1 in xrandr. dspsdfviewer does not open the public presentation on the second monitor anymore. Instead it is opened on the same viewport like the presenter view.
Is this related to the names randr is choosing for the displays? Is it possible to add an option which specifies the desired output name?

Feature request:Keep each slide's time in a table

On rehearsals or for presentations that you often repeat, you want to see where you spend the most time and improve yourself. Storing the per slide timer in a table (one element for each slide) would allow the inspection of those statistics at the end of the presentation.

Relates to #21

Allow for links

It would be great if support for links in the PDF is added. All the nice navigations created with beamer tend to be useless if they are not interactive, so that one can jump to another page if it becomes necessary in a talk.
By the way, compilation under Windows worked well; I can provide a binary if you wish to integrate it.

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.