Giter Club home page Giter Club logo

gir_ffi-gtk's Introduction

GirFFI-Gtk

GirFFI-based Ruby bindings for Gtk+. Supports both Gtk+ 2 and Gtk+ 3.

Usage

Gtk+ 2:

require 'gir_ffi-gtk2'
Gtk.init
win = Gtk::Window.new :toplevel
win.show
GObject.signal_connect(win, "destroy") { Gtk.main_quit }
Gtk.main

Gtk+ 3:

require 'gir_ffi-gtk3'
Gtk.init
win = Gtk::Window.new :toplevel
win.show
GObject.signal_connect(win, "destroy") { Gtk.main_quit }
Gtk.main

See the examples/ directory for more examples.

Install

gem install gir_ffi-gtk

Requirements

First, make sure the ffi gem is properly installed. See its documentation for the necessary requirements.

GirFFI-Gtk itself depends on the GirFFI gem, and the gobject-introspection and gtk+ libaries.

For Debian-like systems, try the following for Gtk+ 3:

apt-get install libgirepository1.0-dev gobject-introspection gir1.2-gtk-3.0

and for Gtk+ 2:

apt-get install libgirepository1.0-dev gobject-introspection gir1.2-gtk-2.0

This gem has not been tested on Mac OS X or Microsoft Windows. YMMV. Pull requests to support these platforms are welcome.

License

Copyright ยฉ 2012โ€“2022 Matijs van Zuijlen

GirFFI-Gtk is free software, distributed under the terms of the GNU Lesser General Public License, version 2.1 or later. See the file COPYING.LIB for more information.

gir_ffi-gtk's People

Contributors

cedlemo avatar dependabot[bot] avatar depfu[bot] avatar jinyeow avatar kaspernj avatar mvz avatar renich avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar

gir_ffi-gtk's Issues

"No such file or directory" ffi_c.so, yet it exists

When I run ruby -r gir_ffi -e '', it tells me ~/.gem/<snip>/ffi-1.0.11/lib/ffi_c.so does not exist, but it is there.

Output of running that, and running file on the "missing" file is below.

[~]$ /usr/bin/ruby1.9.3 -r gir_ffi -e ''
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': libruby.so.1.9: cannot open shared object file: No such file or directory - /home/nick/.gem/ruby/1.9.1/gems/ffi-1.0.11/lib/ffi_c.so (LoadError)
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/nick/.gem/ruby/1.9.1/gems/ffi-1.0.11/lib/ffi.rb:11:in `rescue in <top (required)>'
    from /home/nick/.gem/ruby/1.9.1/gems/ffi-1.0.11/lib/ffi.rb:2:in `<top (required)>'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.4.2/lib/gir_ffi.rb:1:in `<top (required)>'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:59:in `require'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:59:in `rescue in require'
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
[~]$ file /home/nick/.gem/ruby/1.9.1/gems/ffi-1.0.11/lib/ffi_c.so 
/home/nick/.gem/ruby/1.9.1/gems/ffi-1.0.11/lib/ffi_c.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x80eb3d99ec4497f73d088a7bea4d8dc311303368, not stripped
[~]$ 

Accessing overloaded functions

Is there any way to access different versions (parameters) of the same function?

For example

void Gtk::Box::pack_start   (   Widget&     child,
bool    expand,
bool    fill,
guint   padding = 0 
)

is the one I can call, but

void Gtk::Box::pack_start   (   Widget&     child,
PackOptions     options = PACK_EXPAND_WIDGET,
guint   padding = 0 
)

seems to be unreachable - am I missing something?

Difference between gir_ffi-gtk and rubygnome

Hello Matijs,

Could you add one short paragraph to the main page perhaps, explaining just very briefly the difference between gir_ffi bindings and the rubygnome project? Right now I am wondering about it and perhaps others may also profit from a short explanation on the main project page of gir_ffi-gtk. Thanks!

'Gtk::TreeSelection#get_selected_rows' gives "undefined method 'wrap'"

When running the following script the following error occurs because of call to the method in the title:

https://github.com/kaspernj/gir_ffi-gtk/blob/master/examples/06_treeview.rb

(eval):4:in get_selected_rows': undefined methodwrap' for Gtk::TreeModel:Module (NoMethodError)
from /usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.1/lib/gir_ffi/class_base.rb:22:in setup_and_call' from (eval):3:inget_selected_rows'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.1/lib/ffi-gobject/ruby_style.rb:7:in method_missing' from 06_treeview.rb:57:in

'

[Documentation] Could the main README mention which operating systems are supported?

First, I got confused yesterday. I think the github repository "gir_ffi" confused me and I wondered
about the examples, but now I am going through:

https://github.com/mvz/gir_ffi-gtk/tree/master/examples

And these work! \o/ So perhaps I actually meant to go to gir_ffi-gtk rather than gir_ffi (they
kind of looked similar if you look only briefly at the monitor ... sometimes I find the same
project again at a later google search without realising the difference).

If you have several projects/gems, perhaps it can be mentioned or cross-referenced more clearly
or easily in the README about the different projects - some people, such as me, get easily
confused. I have like 30 tabs open right now, multitask a lot and it's confusing my brain ... :D

Anyway. For this issue here, would it be possible to mention in the README which operating
systems are supported? Evidently Linux, I am using that right now, so that works fine, but I'd like
to know if OSX/Apple and Windows/Microsoft would also be supported, if gtk/gdk/gobject-introspection
is available. That way people can quickly see whether the gir-bindings here could work.

By the way, I think many people don't know about the project. Not sure why, I think I found
it only by accident years ago, and then didn't pay attention. The recent gtk4 gem for
ruby-gtk kind of made me interested again so I googled, and found other projects,
again, this one, but also Natalie (if you have not heard about it, the author is also using
ruby; it looks interesting, I asked for GUI examples recently: https://natalie-lang.org/ )

PS: After I have worked through the examples I will consider seeing whether I can support
gir_ffi-gtk via my gtk_paradise gem. That gem is a bit messy
https://rubygems.org/gems/gtk_paradise but a few days ago I tested the same .rb file for
both ruby-gtk3 and ruby-gtk4 and that actually works. So my hope or idea is that I can
use the same code base, sort of, and support all the different gtk-variants / dialects
including gtk2. But right now it's a bit of a mess and I don't want to make any promise -
for now I just focus on ruby-gtk3 mostly, as I can write more code in it and that works
fine; with ruby-gtk4 aka the gtk4 gem I ran into a few problems, including the changed
signal event handling. Not yet sure what to do about that, in ruby-gtk3 it seems much
easier.

Freeze when loading Gtk3 and a class like Vte already exists.

By mistake I loaded "vte" (by require 'vte') and then afterwards GirFFI Gtk3 (by require 'gir_ffi-gtk3'). A lot of warning messages appeared, and I had to kill the application (kill -9 [PID]).

I suggest checking if a class already exists (Kernel#const_defined?) and then raising a LoadError, if a user tries to do this. It makes more sense to me and makes it easier to debug.

The following two lines of code can be used to reproduce ("vte"-gem has to be installed):

require "vte"
require "gir_ffi-gtk3"

These are the warning messages that appeared, before the application froze:

/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-WARNING **:cannot register existing type `GtkWidget'
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-WARNING **:cannot add class private field to invalid type '<invalid>'
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-CRITICAL **:g_type_add_interface_static: assertion `G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-WARNING **:cannot register existing type `GtkBuildable'
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-CRITICAL **:g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-CRITICAL **:g_once_init_leave: assertion `result != 0' failed
/usr/share/ruby-rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.2/lib/ffi-gobject_introspection/i_registered_type_info.rb: line 14
   GLib-GObject-CRITICAL **:g_type_add_interface_static: assertion `G_TYPE_IS_INSTANTIATABLE (instance_type)' failed

Platform differences - NoMethodError

The following works as expected on a brewed mac, but fails miserably in Ubuntu (and probably other distros).

git clone https://github.com/mvz/gir_ffi-gtk.git
cd gir_ffi-gtk/
bundle
bundle exec ruby -e "require 'gir_ffi-gtk3'; Gtk::TreePath.new_from_indices([123])"

Ubuntu:

-e:1:in `<main>': undefined method `new_from_indices' for Gtk::TreePath:Class (NoMethodError)

Allow for Symbols as well as Strings for .signal_connect()

Hey there,

Would it be possible to support:

button.signal_connect(:clicked) { win.destroy }

in addition to:

button.signal_connect('clicked') { win.destroy }

?

So both string, or symbol for signal connect as
argument. The symbol could be converted internally
in whatever code handles the signal-connect
situation. (I don't know how the gir bindings work,
whether you can make such modifications or
not.)

ruby-gtk3 allows both and I use the symbol variant,
since I can omit the trailing '

It is not important, but if it is of no bother to you or
the project here then I think I would like to be able
to use it. It may lead to less uniform downstream
code, so there is a trade-off, but personally I love
symbols for several reasons. Anyway it is just
a suggestion, it is your project so you are making
the decisions which is totally fine. Thank you for
reading!

gir_ffi-gtk appears to be the only gem left now to support ruby-gtk2

Hey there Matijs,

This is just information, which is why I opened and closed the issue, to keep the issue
tracker here clean (or at the least trying to).

Some time ago kou removed support for gtk2 in ruby-gnome:

https://github.com/ruby-gnome/ruby-gnome

For instance, we can see a gtk3/ subdirectory, and a gtk4/ subdirectory, but no longer
gtk2/. This is probably understandable as it took his time maintaining bindings and
most people have probably moved on to gtk3/.

I just tested gir_ffi-gtk and using gtk2 works still. I maintain one specific gtk-project,
and for that project I use gtk3 primarily. One day I may transition into gtk4. As for
gtk2, I am pleased to have found out that gir_ffi-gtk works fine, so if gir_ffi-gtk
makes gtk2 support available then I'll also support it in my own gem. (This does not
work that well right now because I spent a LOT of time with regard to gtk3 and
only very little with gtk2, but now that I have confirmed today that gtk2 works
still, I'll adapt my project to support both the "gtk3" gem as well as gir_ffi-gtk,
also for both gtk2, and gtk3. So I have two versions to support for gtk3, aka
the one by kou and gir_ffi-gtk, whereas for gtk2 support I now only have
gir_ffi-gtk. Not that this affects many people, as there are not that many people
using ruby-gtk in general, probably only a bit more than ruby-libui, but it is also
a bit of a chicken-egg problem, so the few people who may benefit from it, may
be happy to hear that gtk2 is still an option, via gir_ffi-gtk. Some old code out
there on the www still shows gtk2, so it would be kind of cool to have that not
lost to the void but still supportable, via gir_ffi-gtk. Anyway that was it, just
info for you.)

Assertion in Gtk::Application#app_menu=

Using Gtk::Application I get an assertion when trying to set the app_menu

(ruby:21453): GLib-GObject-CRITICAL **: 
g_value_set_instance: assertion 
`g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), 
G_VALUE_TYPE (value))' failed

Example code can be found here: gist

I tried to wrap my head around the gir_ffi library but it looks like I need help.

Crash when running on Mac

port install gtk3
brew install gobject-introspection

Then in Ruby:

require "gir_ffi-gtk3"

Got the following:

Kasper-Johansens-MacBook-Air:GirFFITest kaspernj$ ruby start.rb
This platform and/or version of gobject-introspection are not supported by GirFFI.
Please file bugs for any errors found.
/Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/ffi-gobject_introspection/i_repository.rb:81:in require': Typelib file for namespace 'Gtk', version '3.0' not found (RuntimeError) from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi/builder/module.rb:135:ingir'
from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi/builder/module.rb:75:in build_dependencies' from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi/builder/module.rb:48:inbuild_module'
from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi/builder/module.rb:20:in generate' from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi/builder.rb:27:inbuild_module'
from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-0.4.0/lib/gir_ffi.rb:14:in setup' from /Users/kaspernj/.rvm/gems/ruby-1.9.2-head/gems/gir_ffi-gtk-0.4.0/lib/gir_ffi-gtk3.rb:3:in<top (required)>'
from /Users/kaspernj/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in require' from /Users/kaspernj/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:inrescue in require'
from /Users/kaspernj/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in require' from start.rb:4:in

'

Same error with Gtk2. I am willing to give access to my machine by using VNC or something else, if that can help.

More examples needed

Hello,

IMHO, the examples are awesome; but too few.

I've requested collaboration around google+; specifically, in the ruby, gnome and gtk+ communities.

Having a full text editor or some sample app that shows how to use it would be awesome, if you ask me.

Can't find *.so.0

Now that that other issue was fixed, the webkit example isn't working for me because it cannot find libwebkitgtk-3.0.so. I only have libwebkitgtk-3.0.so.0.

sudo ln -s /usr/lib/libwebkitgtk-3.0.so{.0,} fixed it, but that's far from optimal.

Output when running before adding that symlink:

/home/nick/.gem/ruby/1.9.1/gems/ffi-1.6.0/lib/ffi/library.rb:123:in `block in ffi_lib': Could not open library 'webkitgtk-3.0': webkitgtk-3.0: cannot open shared object file: No such file or directory. (LoadError)
Could not open library 'libwebkitgtk-3.0.so': libwebkitgtk-3.0.so: cannot open shared object file: No such file or directory
    from /home/nick/.gem/ruby/1.9.1/gems/ffi-1.6.0/lib/ffi/library.rb:90:in `map'
    from /home/nick/.gem/ruby/1.9.1/gems/ffi-1.6.0/lib/ffi/library.rb:90:in `ffi_lib'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:94:in `setup_lib_for_ffi'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:57:in `build_module_non_recursive'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder.rb:31:in `build_module_non_recursive'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:69:in `block in build_dependencies'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:67:in `each'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:67:in `build_dependencies'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:48:in `build_module'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder/module.rb:20:in `generate'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi/builder.rb:27:in `build_module'
    from /home/nick/.gem/ruby/1.9.1/gems/gir_ffi-0.5.1/lib/gir_ffi.rb:19:in `setup'
    from ./browser.rb:6:in `<main>'

Missing constants? How to proceed in this case? Example: Gtk::StyleProvider::PRIORITY_APPLICATION

Hi,

I am experimenting with gir_ffi-gtk right now.

One thing I want to get to work is CSS support. I have a lot of
CSS that allows me to tweak a lot, starting this from the www
era before I used ruby, and then also for ruby-gtk3 lateron.

I had this code in ruby-gtk3:

screen = Gdk::Screen.default

in gir_ffi-gtk this also works but I have to use this:

screen = Gdk::Screen.get_default

Not a big change/difference so this is fine.

I solved this issue, but now I have another problem.

In ruby-gtk3 I would use this to initialize a new style
context:

::Gtk::StyleContext.add_provider_for_screen(
  screen,
  provider,
  ::Gtk::StyleProvider::PRIORITY_APPLICATION
)

But the last part, aka:

Gtk::StyleProvider::PRIORITY_APPLICATION

is not known by gir_ffi-gtk.

It is a constant.

So my next idea was to use pp:

pp ::Gtk::StyleProvider.constants.sort

But only three constants are shown via Array here:

[:GIR_FFI_BUILDER, :GIR_INFO, :G_TYPE]

No PRIORITY_APPLICATION. Perhaps the name is different
or I have to use constants differently - I really don't
know right now. Or perhaps there is a bug with gir_ffi-gtk
so I report this here just in case. Others may also find
this via a google search.

GTK_STOCK_* unavailable

I can't seem to find the definitions. Am I looking at the wrong place (I'm expecting Gtk::STOCK_EXECUTE or something like this)

Gtk::DrawingArea is not showed

Here is an example in C

// compile with `pkg-config --libs --cflags gtk+-3.0`
#include <gtk/gtk.h>

gboolean
draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
{
  guint width, height;
  GdkRGBA color;

  width = gtk_widget_get_allocated_width (widget);
  height = gtk_widget_get_allocated_height (widget);
  cairo_arc (cr,
             width / 2.0, height / 2.0,
             MIN (width, height) / 2.0,
             0, 2 * G_PI);

  gtk_style_context_get_color (gtk_widget_get_style_context (widget),
                               0,
                               &color);
  gdk_cairo_set_source_rgba (cr, &color);

  cairo_fill (cr);

  return FALSE;
}

int main(int argc, char **argv)
{
  gtk_init (&argc, &argv);
  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_set_size_request (drawing_area, 100, 100);
  g_signal_connect (G_OBJECT (drawing_area), "draw",
                    G_CALLBACK (draw_callback), NULL);

  GtkWidget *window;
  /* Set up the UI */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  /* Exit when the window is closed */
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  gtk_widget_show_all (window);

  gtk_main ();
  return 0;
}

Its counterpart in ruby

require 'gir_ffi-gtk3'

Gtk.init

draw_area = Gtk::DrawingArea.new
GObject.signal_connect(draw_area, "draw") do |widget, ctx|
  width = widget.get_allocated_width
  height = widget.get_allocated_height
  ctx.arc(width / 2.0, height / 2.0, [width, height].min / 2.0, 0, 2 * Math::PI)
  ctx.set_source_rbga(1, 1, 0, 0.5)
  ctx.fill
  false
end
draw_area.set_size_request(100, 100)

win = Gtk::Window.new :toplevel
win.add(draw_area)
win.show_all
GObject.signal_connect(win, "destroy") { Gtk.main_quit }

Gtk.main

It isn't showing anything except the blank window, am I missing something?
thanks in advance!

gtk4 support?

Ruby-gtk4 recently added support for gtk4 (Well, actually ruby-gnome, but ruby-gtk4 is part of
these bindings there). I also tested hello world, it works:

Here the copy paste version for you guys to test.

#!/usr/bin/env ruby 
require 'gtk4'

application = Gtk::Application.new('org.gtk.example', :flags_none)

application.signal_connect(:activate) { |app|
  win = Gtk::ApplicationWindow.new(app)
  win.title = 'window'
  win.set_default_size(600, 400)

  button = Gtk::Button.new(label: 'Hello World')
  button.signal_connect(:clicked) {
    puts "Hello World"
    win.destroy
  }
  win.set_child(button)
  win.show
}

application.run

Are there plans for gir_ffi-gtk to add support?

The API changed quite a lot but by and large ruby-gtk4 is not so
dissimilar to ruby-gtk3 so at the least for simple examples, I think
it should not be too difficult to get it to work.

Gtk.init

Hi.

I see the example:

require 'gir_ffi-gtk2'
Gtk.init

Could Gtk.init become optional? In ruby-gnome this already is.

Alternatively, perhaps one could write a init.rb file that does this.

Then we could require it like so:

require 'gir_ffi-gtk2/init'

Example for the latter also here:

https://github.com/yuki24/did_you_mean

At extra features

require 'did_you_mean/extra_features'

Simple but "effective" trick. Anyway if this is not a good fit for the
project, just close the issue request here. Thanks!

Threadding and high CPU usage

The current fix with "idle_add" takes a lot of CPU, if you have a constantly running app like my PulseAudio applet (called "pulseaudio" here on Gitub).

Inserting sleeps between idles makes threadding run really slow - almost becoming useless.

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.