Giter VIP home page Giter VIP logo

wiki_external_filter's Introduction

             Redmine Wiki External Filter Plugin
             ===================================
          Copyright (C) 2010 Alexander Tsvyashchenko,
          http://www.ndl.kiev.ua - see COPYRIGHT.txt

Overview

This plugin allows defining macros that process macro argument using external filter program and render its result in Redmine wiki.

For every filter two macros are defined: <macro> and <macro>_include. The first one directly processes its argument using filter, while the second one assumes its argument is wiki page name, so it reads that wiki page content and processes it using the filter.

Macros already bundled with current release are listed below, but adding new ones is typically as easy as adding several lines in plugin config file.

Installation

  1. It's recommended (but not required) to install popen4 library first as without it plugin is unable to capture stderr output of external command, so it might be hard to debug it if things go wrong.

  2. Get sources from github.

  3. See Installing a plugin on Redmine site.

  4. Copy wiki_external_filter.yml from config folder of plugin directory to the config folder of your redmine installation.

  5. After installation it's strongly recommended to go to plugin settings and configure caching: Administration -> Plugins -> Wiki External Filter Plugin: Configure and follow instructions. Note that RoR file-based caching suggested by default does not implement proper cache expiration: you should either setup a cron task to clean cache or do it manually from time to time.

  6. To successfully use macros with argument expressions, it's necessary to patch wiki formatting routine so that it preserves macros arguments.

    Redmine 1.0.2: apply this patch to the Redmine core and go to step 7, there's no need to patch individual wiki formatters anymore.

    Redmine 0.9.x: if you use Markdown Extra, switch to the following fork of redmine_markdown_extra_formatter that contains all necessary changes. This patch is for older Markdown Extra formatter version and should not be used for new installations.

    Note: if you install Markdown Extra formatter - you should enable it in Administration -> Settings -> General -> Text formatting.

    If you use wiki formatter other than Markdown Extra (including default Textile formatter) you will have to change your wiki formatter yourselves as follows:

    • Change MACROS_RE regexp not to stop too early - in the issue description Textile wiki formatter is mentioned, but in fact this change should be done for whatever wiki formatter you use.
    • Change arguments parsing - again, should be done for whatever wiki formatter you use.
    • For some of the formatters escaping should be avoided for macro arguments, see how it is done for Markdown Extra wiki formatter.

    Preliminary version of patch for Textile support was made available by Yuya Nishihara, according to the author "It works but really messy" but I haven't tested it so cannot comment on it.

  7. To allow passing attachments names as macros arguments Redmine core should be patched accordingly: here's the patch for Redmine 1.0.2 and here is the patch for Redmine 0.9.x.

Specific filters installation instructions are below.

Prefedined Macros

plantuml

PlantUML is a tool to render UML diagrams from their textual representation. It's assumed that it can be invoked via wrapper /usr/bin/plantuml, here's its example content:

#!/bin/bash
/usr/bin/java -Djava.io.tmpdir=/var/tmp -jar /usr/share/plantuml/lib/plantuml.jar ${@}

Result is rendered as PNG file. SVG support seems to be under development for PlantUML but so far looks like it's still unusable.

Gentoo ebuild is attached.

Example of usage:

{{plantuml(
Alice -> Bob: Authentication Request
alt successful case
  Bob -> Alice: Authentication Accepted
else some kind of failure
  Bob -> Alice: Authentication Failure
  opt
    loop 1000 times
      Alice -> Bob: DNS Attack
    end
  end
else Another type of failure
  Bob -> Alice: Please repeat
end
)}}

Rendered output:

PlantUML output

graphviz

Graphviz is a tool for graph-like structures visualization. It's assumed that it can be called as /usr/bin/dot.

Result is rendered as SVG image or PNG fallback if SVG is not supported by your browser.

Example of usage:

{{graphviz(
digraph finite_state_machine {
    rankdir=LR;
    size="8,5"
    node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
    node [shape = circle];
    LR_0 -> LR_2 [ label = "SS(B)" ];
    LR_0 -> LR_1 [ label = "SS(S)" ];
    LR_1 -> LR_3 [ label = "S($end)" ];
    LR_2 -> LR_6 [ label = "SS(b)" ];
    LR_2 -> LR_5 [ label = "SS(a)" ];
    LR_2 -> LR_4 [ label = "S(A)" ];
    LR_5 -> LR_7 [ label = "S(b)" ];
    LR_5 -> LR_5 [ label = "S(a)" ];
    LR_6 -> LR_6 [ label = "S(b)" ];
    LR_6 -> LR_5 [ label = "S(a)" ];
    LR_7 -> LR_8 [ label = "S(b)" ];
    LR_7 -> LR_5 [ label = "S(a)" ];
    LR_8 -> LR_6 [ label = "S(b)" ];
    LR_8 -> LR_5 [ label = "S(a)" ];
}
)}}

Rendered output:

Graphviz output

ritex

Combination of Ritex: a Ruby WebTeX to MathML converter and SVGMath that takes WebTeX formula specification as input and produces SVG file as output.

Both ritex and SVGMath require some patches/wrappers.

Additionally working installation of xmllint from libxml2 with configured MathML catalog is required: for Gentoo use this ebuild.

Gentoo ebuilds for ritex and svgmath are attached.

Example of usage:

{{ritex(
G(y) = \left\{\array{ 1 - e^{-\lambda x} & \text{ if } y \geq 0 \\ 0 & \text{ if } y < 0 }\right.
)}}

Rendered output:

Ritex output

video and video_url

These macros use ffmpeg to convert any supported video file to FLV format and display it on wiki using FlowPlayer flash player. video macro takes file path on server as its input, as well as attachments names from current wiki page, while video_url expects full URL to the video to convert & show.

Splash images for videos are generated automatically from the first frame of the video.

Multiple videos per page are supported, player instance is attached to the selected video as in this example.

Required packages installed:

  • ffmpeg
  • RMagick
  • wget - for video_url only.

Example of usage:

{{video(video_attachment_name.avi)}}

or

{{video(/full/path/to/the/file/on/the/server/video.avi)}}

or

{{video_url(http://www.example.com/video.avi)}}

Rendered output (before player is embedded by clicking on the image, using Flowplayer video demo file):

Video output

fortune

Fortune is a simple program that displays a random message from a database of quotations.

Not strictly a filter on its own (as it does not require any input), but it plays nice with external filtering approach and is fun to use, hence it's here ;-)

Example of usage:

{{fortune}}

Rendered output:

Fortune output

Writing new macros

New macros can easily be added via wiki_external_filter.yml config file.

Every macro may have multiple commands processing the same input - for example for video macro two commands are used: first one extracts thumbnail and second one converts the video.

Commands use standard Unix approach for filtering: input is fed to the command via stdin and output is read on stdout. If command return status is zero, content type is assumed to be of content_type specified in config, otherwise it's assumed to be plain error text together with stderr content.

You can use prolog/epilog config parameters to add standard text before/after actual macro content passed to filter.

Additionally, cache_seconds parameter specifies the number of seconds commands output result should be cached, use zero to disable caching for this macro.

The way filter output is visualized is controlled via app/views/wiki_external_filter/macro_*.html.erb files. The view to use is selected by template macro option in config. The view can use all commands outputs for particular macro.

replace_attachments tells plugin that it should parse the text passed to the macro and replace all occurrences of strings matching attachments names with their physical paths on disk.

Macro argument is de-escaped via CGI.unescapeHTML call prior to being fed to filter.

Current bugs/issues

  1. Either Redmine core (if you use default wiki engine) or your custom wiki engine plugin requires patching to get things work. In fact, the whole wiki formatting design as of now seems to be quite messy.
  2. SVG support is more complex it should have been if all browsers had played by the rules - currently quite some trickery with different XHTML elements/CSS tricks is used to show SVGs properly in major browsers. Of course, there's not that much that can be done for IE as it does not support SVG at all, but now at least the plugin substitutes raster fall-back image for IE if it is available.
  3. For formula support, theoretically ritex alone is sufficient if you have MathML-capable browser, however in practice there are too many issues with this approach: for example Firefox (actually the onlt MathML-capable browser so far, it seems) requires specific DOCTYPE additions that Redmine currently lacks; additionally, Redmine emits text/html, while Firefox expects text/xml in order to parse MathML. Changing content type alone is not sufficient as Redmine HTML output does not pass more strict checks required for XML output. Hence, the double conversion (WebTeX to MathML and then MathML to SVG) is necessary. Once (if ever?) MathML support matures in other browser, possibly this can be revisited.
  4. SVGs could have been embedded into HTML page directly (thus allowing to use redmine links there) but I'm afraid there are similar problems as with MathML embedding attempts.
  5. RoR caching support is a mess: no way to expire old files from file-based cache??? Are you joking???

Additional info

  1. Somewhat similar plugins (although with narrower scope) are graphviz plugin and latex plugin. Graphviz functionality is mostly covered by current version of wiki_external_filter. Latex is not, but only due to the fact I do not have latex installed nor currently have a need in that: adding macro that performs latex filtering should be trivial.

wiki_external_filter's People

Contributors

ndl 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wiki_external_filter's Issues

PlantUML fails as it needs a linebreak after @startuml

The PlantUML macro fails (It was working before, I don't know which upgrade made it fail, but I'm running Redmine 2.2.3 and PlantUML 7958), telling me there's no @startuml found. In fact, the prolog is set-up fine, but PlantUML seems to absolutely need a linebreak between @startuml and the rest of the input. For now, I added two linebreaks around the main text in the pipe, as I only use the PlantUML filter. But the real issue here, is that the filter is wrong. And I don't know how to possibly add linebreaks in the YAML config file, they seems to be ignored.

(By the way, I know you don't support it anymore, I'm using @zZLOiz 's fork, but GitHub doesn't allow to open issues on forks…)

Not working for redmine 1.2.1

Hi,

in Redmine 1.2.1 the Plugin does not work.

production.log ::debug

Processing WikiExternalFilterController#filter (for _..**.**_ at 2011-07-26 15:21:33) [GET]
I, [2011-07-26T15:21:33.972663 #12175] INFO -- : Parameters: {"name"=>"8c8000772a6d91d2b1363d0852469994ffa36e6bd27f87d6d1e4c38fa9102926", "macro"=>"plantuml", "action"=>"filter", "index"=>"0", "controller"=>"wiki_external_filter"}
D, [2011-07-26T15:21:33.975365 #12175] DEBUG -- : �[4;36;1mSQL (0.2ms)�[0m �[0;1mSELECT max(settings.updated_on) AS max_updated_on FROM settings �[0m
D, [2011-07-26T15:21:33.978998 #12175] DEBUG -- : �[4;35;1mUser Load (0.2ms)�[0m �[0mSELECT * FROM users WHERE (users.id = 5) AND (users.status = 1) AND ( (users.type = 'User' OR users.type = 'AnonymousUser' ) ) �[0m
D, [2011-07-26T15:21:33.991598 #12175] DEBUG -- : Cached fragment hit: views/wiki_external_filter/plantuml/8c8000772a6d91d2b1363d0852469994ffa36e6bd27f87d6d1e4c38fa9102926 (0.1ms)
I, [2011-07-26T15:21:33.994562 #12175] INFO -- : Rendering template within layouts/base
I, [2011-07-26T15:21:33.994777 #12175] INFO -- : Rendering common/error (404)
D, [2011-07-26T15:21:34.000345 #12175] DEBUG -- : �[4;36;1mUserPreference Load (0.2ms)�[0m �[0;1mSELECT * FROM user_preferences WHERE (user_preferences.user_id = 5) LIMIT 1�[0m
D, [2011-07-26T15:21:34.186964 #12175] DEBUG -- : Rendered code_review/_html_header (0.1ms)
D, [2011-07-26T15:21:34.192807 #12175] DEBUG -- : Rendered hooks/opensearch/_view_layouts_base_html_head (1.0ms)
D, [2011-07-26T15:21:34.200825 #12175] DEBUG -- : Rendered wiki_extensions/_html_header (0.2ms)
D, [2011-07-26T15:21:34.205290 #12175] DEBUG -- : �[4;35;1mProject Load (0.2ms)�[0m �[0mSELECT * FROM projects WHERE (projects.status=1 AND projects.id IN (SELECT em.project_id FROM enabled_modules em WHERE em.name='stuff_to_do_module')) �[0m
D, [2011-07-26T15:21:34.217904 #12175] DEBUG -- : �[4;36;1mFavouriteProject Load Including Associations (5.7ms)�[0m �[0;1mSELECT favourite_projects.id AS t0_r0, favourite_projects.user_id AS t0_r1, favourite_projects.project_id AS t0_r2, projects.id AS t1_r0, projects.name AS t1_r1, projects.description AS t1_r2, projects.homepage AS t1_r3, projects.is_public AS t1_r4, projects.parent_id AS t1_r5, projects.created_on AS t1_r6, projects.updated_on AS t1_r7, projects.identifier AS t1_r8, projects.status AS t1_r9, projects.lft AS t1_r10, projects.rgt AS t1_r11, projects.customer_id AS t1_r12, projects.dmsf_description AS t1_r13 FROM favourite_projects LEFT OUTER JOIN projects ON projects.id = favourite_projects.project_id WHERE (user_id = 5) ORDER BY projects.name�[0m
D, [2011-07-26T15:21:34.224293 #12175] DEBUG -- : �[4;35;1mMember Load Including Associations (3.5ms)�[0m �[0mSELECT members.id AS t0_r0, members.user_id AS t0_r1, members.project_id AS t0_r2, members.created_on AS t0_r3, members.mail_notification AS t0_r4, members.dmsf_mail_notification AS t0_r5, projects.id AS t1_r0, projects.name AS t1_r1, projects.description AS t1_r2, projects.homepage AS t1_r3, projects.is_public AS t1_r4, projects.parent_id AS t1_r5, projects.created_on AS t1_r6, projects.updated_on AS t1_r7, projects.identifier AS t1_r8, projects.status AS t1_r9, projects.lft AS t1_r10, projects.rgt AS t1_r11, projects.customer_id AS t1_r12, projects.dmsf_description AS t1_r13, roles.id AS t2_r0, roles.name AS t2_r1, roles.position AS t2_r2, roles.assignable AS t2_r3, roles.builtin AS t2_r4, roles.permissions AS t2_r5, roles.issues_visibility AS t2_r6 FROM members LEFT OUTER JOIN projects ON projects.id = members.project_id LEFT OUTER JOIN member_roles ON (members.id = member_roles.member_id) LEFT OUTER JOIN roles ON (roles.id = member_roles.role_id) WHERE (members.user_id = 5 AND (projects.status=1)) ORDER BY projects.name�[0m
D, [2011-07-26T15:21:34.237903 #12196] DEBUG -- : �[4;36;1mSQL (0.2ms)�[0m �[0;1mSET NAMES 'utf8'�[0m
D, [2011-07-26T15:21:34.249046 #12196] DEBUG -- : �[4;35;1mSQL (7.5ms)�[0m �[0mSET SQL_AUTO_IS_NULL=0�[0m
D, [2011-07-26T15:21:34.293177 #12175] DEBUG -- : Rendered code_review/_body_bottom (0.3ms)
I, [2011-07-26T15:21:34.302104 #12175] INFO -- : Completed in 329ms (View: 309, DB: 0) | 404 Not Found [http://my.redmine/wiki_external_filter/filter?index=0&macro=plantuml&name=8c8000772a6d91d2b1363d0852469994ffa36e6bd27f87d6d1e4c38fa9102926]
D, [2011-07-26T15:21:34.337123 #12200] DEBUG -- : �[4;36;1mSQL (0.3ms)�[0m �[0;1mSET NAMES 'utf8'�[0m
D, [2011-07-26T15:21:34.349010 #12200] DEBUG -- : �[4;35;1mSQL (8.2ms)�[0m �[0mSET SQL_AUTO_IS_NULL=0�[0m
D, [2011-07-26T15:21:34.389195 #12202] DEBUG -- : �[4;36;1mSQL (0.2ms)�[0m �[0;1mSET NAMES 'utf8'�[0m
D, [2011-07-26T15:21:34.392193 #12202] DEBUG -- : �[4;35;1mSQL (0.2ms)�[0m �[0mSET SQL_AUTO_IS_NULL=0�[0m
D, [2011-07-26T15:21:34.456809 #12204] DEBUG -- : �[4;36;1mSQL (0.3ms)�[0m �[0;1mSET NAMES 'utf8'�[0m
D, [2011-07-26T15:21:34.459688 #12204] DEBUG -- : �[4;35;1mSQL (0.2ms)�[0m �[0mSET SQL_AUTO_IS_NULL=0�[0m
plz update ur plugin for version 1.2.1 (without core patches).
Thanks!

doesn't work on redmine 9.2.0

Could you please investigate issue with redmine 9.2 and your plugin.
Here are script/about output:
About your application's environment
Ruby version 1.8.7 (i486-linux)
RubyGems version 1.3.5
Rack version 1.0
Rails version 2.3.5
Active Record version 2.3.5
Active Resource version 2.3.5
Action Mailer version 2.3.5
Active Support version 2.3.5
Application root /var/www/railst
Environment development
Database adapter mysql
Database schema version 20091227112908

About your Redmine plugins
Redmine Wiki Extensions plugin 0.2.0
Redmine ezLibrarian plugin 0.1.1
Bulk Time Entry 0.4.0
Wiki External Filter Plugin 0.0.1
Google Calendar Plugin 0.1.2
Messenger Plugin 0.0.9
Timesheet Plugin 0.5.0
Redmine Blogs plugin 0.0.3
Issue Due Date 0.1.0
Customer plugin 0.2.0
Charts Plugin 0.0.14
Redmine Graphs plugin 0.1.0
Redmine Issues Group plugin 0.1.7

production.log:

ActionView::TemplateError (undefined method `fragment_cache_store' for ActionController::Base:Class) on line #19 of vendor/plugins/wiki_external_filter/app/views/wiki_external_filter/_settings.html.erb:
16:


17: Current cache settings are:

18: ActionController::Base.cache_configured? = <%= h ActionController::Base.cache_configured? ? "true" : "false" %>

19: ActionController::Base.fragment_cache_store = <%= h ActionController::Base.fragment_cache_store.inspect %>
20:


21:

vendor/plugins/wiki_external_filter/app/views/wiki_external_filter/_settings.html.erb:19
app/views/settings/plugin.rhtml:6:in `_run_rhtml_app47views47settings47plugin46rhtml'
app/views/settings/plugin.rhtml:4:in `_run_rhtml_app47views47settings47plugin46rhtml'
passenger (2.2.9) lib/phusion_passenger/rack/request_handler.rb:92:in `process_request'
passenger (2.2.9) lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:400:in `start_request_handler'
passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:351:in `handle_spawn_application'
passenger (2.2.9) lib/phusion_passenger/utils.rb:184:in `safe_fork'
passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:349:in `handle_spawn_application'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:163:in `start'
passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:209:in `start'
passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:262:in `spawn_rails_application'
passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:256:in `spawn_rails_application'
passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:80:in `synchronize'
passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:255:in `spawn_rails_application'
passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:154:in `spawn_application'
passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:287:in `handle_spawn_application'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'

Rendering /var/www/railst/public/500.html (500 Internal Server Error)
Thanks in advance

Graphviz doesn't work anymore

Redmine 1.2.1
Performed the patch, as specified in the instructions.

Adding

{{graphviz(
digraph G {
a ->b;
}
)}}

results in


Error executing the graphviz macro (undefined method `pop' for "\ndigraph G {\na ->b;\n}\n":String)

Video embedding failed

I Installed ffmeg, librmagick, and wget through apt-get. I pulled the last git revision.

I attached a video (http://www.cna.org/isaac/einstein_fluid.avi) to a wiki site, and added {{video(einstein_fluid.avi)}} . I got following error:

Error executing the video macro ( ActionView::TemplateError (undefined method +' for nil:NilClass) on line #5 of vendor/plugins/wiki_external_filter/app/views/wiki_external_filter/macro_flash-video.html.erb: 2: require 'RMagick' 3: image = Magick::Image::from_blob(content[0]).first 4: %> 5: ' href='<%= ActionController::Base.relative_url_root + "/wiki_external_filter/#{macro}.flv?name=#{name}" %>' title='<%= h source %>' style='display:block;width:<%= image.columns %>px;height:<%= image.rows + 24 %>px;background-image:url(<%= url_for(:controller => 'wiki_external_filter', :action => 'filter', :macro => macro, :name => name, :index => 0) %>);background-repeat:no-repeat'><%= image_tag 'play_large.png', :plugin => 'wiki_external_filter', :style => "display:block;position:relative;left:#{image.columns / 2 - 83 / 2}px;top:#{image.rows / 2 - 83 / 2}px" %> 6: <% 7: content_for :header_tags do 8: if not @flowplayer_scripts_included vendor/plugins/wiki_external_filter/app/views/wiki_external_filter/macro_flash-video.html.erb:5 vendor/plugins/wiki_external_filter/app/helpers/wiki_external_filter_helper.rb:151:inrender_common' vendor/plugins/wiki_external_filter/app/helpers/wiki_external_filter_helper.rb:135:in render_tag' vendor/plugins/wiki_external_filter/app/helpers/wiki_external_filter_helper.rb:166:inrender' vendor/plugins/wiki_external_filter/init.rb:23:in macro_video' lib/redmine/wiki_formatting/macros.rb:24:insend' lib/redmine/wiki_formatting/macros.rb:24:in exec_macro' app/helpers/application_helper.rb:456 lib/redmine/wiki_formatting.rb:124:incall' lib/redmine/wiki_formatting.rb:124:in execute_macros' lib/redmine/wiki_formatting.rb:116:ingsub!' lib/redmine/wiki_formatting.rb:116:in execute_macros' lib/redmine/wiki_formatting.rb:62:into_html' app/helpers/application_helper.rb:456:in textilizable' app/views/wiki/_content.rhtml:2:in_run_rhtml_app47views47wiki47_content46rhtml_locals_content_object' app/views/wiki/show.rhtml:30:in _run_rhtml_app47views47wiki47show46rhtml' app/controllers/wiki_controller.rb:61:inindex' )

Thanks in advance!

Cheers,
Siamak

Commas are stripped off in latex

How do I make commas (e.g., "x,y") show up?
I tried {{latex(${x,y})}} and {{latex(${x{,}y})}}
but in both cases I get simply "xy".
I am using Redmine 1.1.2 w/Textile (i.e., default setup).

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.