Giter Site home page Giter Site logo

emesene / emesene Goto Github PK

View Code? Open in Web Editor NEW
318.0 23.0 165.0 48.72 MB

emesene is an instant messenger capable of connecting to various networks and utilizing different graphical toolkits. Currently msn and jabber are supported through papyon and xmppy, which allows emesene to connect to various IM services such as Windows Live Messenger, GTalk, Facebook Chat, etc.

Home Page: http://www.emesene.org

License: Other

Python 99.63% Shell 0.24% JavaScript 0.13%

emesene's Introduction

emesene

emesene is an instant messenger capable of connecting to various networks and utilizing different graphical toolkits. Currently msn and xmpp (jabber) are supported through papyon and SleekXMPP, which allows emesene to connect to various IM services such as Windows Live Messenger, GTalk, Facebook Chat, etc.

Useful links

Upstream libraries repositories

emesene embeds in its codebase a number of python libraries for the different service it supports. We embed them instead of using git submodules so we can make packagers' life better and hotfix eventual bugs.

emesene's People

Contributors

arielj avatar astagi avatar boyska avatar c10ud avatar cando avatar chy168 avatar dequis avatar flavioribeiro avatar gvisconti84 avatar ivan25 avatar j0hn avatar jamesaxl avatar joshf avatar kerosyn avatar lfottaviano avatar manuargue avatar marianoguerra avatar moneycat avatar mystro256 avatar nenemfromhell avatar otacon avatar ricsipontaz avatar sbte avatar shuhaowu avatar shwangdev avatar sledgehammer999 avatar smile4ever avatar sworiginal avatar waynesan avatar zincr0 avatar

Stargazers

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

Watchers

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

emesene's Issues

Papyon don't receive files

I get this papyon exception when i try to receive a file:

[11:47:54 ERROR papyon.msnp2p.session_manager] No handler could handle euf-guid {5D3E02AB-6190-11D3-BBBB-00C04F795683}

.config/emesene2 folders mess

Hi, I think we need a better way to handle all those folders...

I mean... I have a lot of folders inside there, one for every contact on the list of each account that have ever logged in and also a folder for each server that was used (dummy, gtalk's, messenger, facebook) with the accounts used on those servers.

I think that the best solution is:
One folder for each server
One folder for each logged account inside each server
A "contacts_cache" folder or something like that inside each logged account with all the folders created for the contact list's users

What do you think? I'm not sure yet what do I have to touch to fix that, but I'd like your feedback before doing anything...

EDIT: also, some parts of the code uses "-at-" instead of @ for logged users, what should we use? I think that @ is better

Problem with Menu: An integer is required

I'm running last Mariano's repo and I get this error when I try to open preferences:

Traceback (most recent call last):
File "/home/saverio/emesene2/emesene/gui/gtkui/MainMenu.py", line 157, in
lambda *args: self.handler.on_preferences_selected())
File "/home/saverio/emesene2/emesene/gui/base/Handler.py", line 100, in on_preferences_selected
Preferences(self.session).show()
File "/home/saverio/emesene2/emesene/gui/gtkui/Preferences.py", line 86, in init
self.interface = Interface(session)
File "/home/saverio/emesene2/emesene/gui/gtkui/Preferences.py", line 379, in init
'session.config.b_toolbar_small')
File "/home/saverio/emesene2/emesene/gui/gtkui/Preferences.py", line 228, in append_check
widget.set_active(default)
TypeError: an integer is required

Unable to start

Traceback (most recent call last):
File "./emesene", line 33, in
emesene.main()
File "/home/hit/Apps/mesinyer/mesinyer/emesene.py", line 535, in main
main_method(Controller)
File "/home/hit/Apps/mesinyer/mesinyer/gui/gtkui/init.py", line 44, in gtk_main
controller.start()
File "/home/hit/Apps/mesinyer/mesinyer/emesene.py", line 414, in start
print "Debug" + int(self.config.d_remembers[account])
TypeError: 'NoneType' object is unsubscriptable

Display photo & nickname

Although, in your machine, your nickname, message, and pictures are shown correctly (the nick and message are correctly taken from the msn servers). Others see them wrong.
For example, my nickname is "Nick", my message is "I'm testing", and i've recently set up a new photo. Others, instead of seeing my nick see "N" (As it would have set up since the msn nickname bug of emesene 1.0); instead of my message they see a blank espace (as if i had no message) and finally they see that i have no display picture.
Note: if i change my nick, the nick is correctly seen by others,,, But if i disconnect and then connect, the nick others see isn't the correct one (the one that i've choosen in my previuos session, the one mesinyer display in my machine).

emesene2 license

we must apply the header to all source files i think

also: are we going for gpl2? i'd go for 3.0 since we're no lib or whatever..

Exception on login

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in bootstrap_inner
self.run()
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/Worker.py", line 167, in run
self._process(data)
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/Worker.py", line 207, in _process
self._process_login(message)
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/Worker.py", line 216, in _process_login
handler(message)
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/Worker.py", line 395, in _on_user
succeed = self.do_passport_identification()
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/Worker.py", line 292, in do_passport_identification
self.session.extras.update(SSoParser(data).tokens)
File "/home/hit/Apps/emesene2/mesinyer/e3/msn/XmlParser.py", line 192, in __init

self.parser.Parse(xml_raw)
ExpatError: syntax error: line 1, column 0

Problem with recent file tranfer implementation.

Using papyon session. If (in emesene2) press the button to upload something to the current contact, this is what I get in the console:

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/home/hammered/Desktop/emesene2/emesene/e3/papylib/Worker.py", line 118, in run
self._process_action(action)
File "/home/hammered/Desktop/emesene2/emesene/e3/base/Worker.py", line 148, in _process_action
self.action_handlersaction.id_
File "/home/hammered/Desktop/emesene2/emesene/e3/papylib/Worker.py", line 999, in _handle_action_ft_invite
papysession = self._ft_manager.send(papycontact, filename, os.path.getsize(completepath))
AttributeError: 'Worker' object has no attribute '_ft_manager'

But "_ft_manager" should exist since Worker derives from papyon.Client. I am buffled. :S

Commit 7617c13d47e5 has broken the dummy session

When I use the dummy session to test emesene I get these warnings in the terminal and the main window isn't drawn correctly(just the windows decorations show up and nothing else):

[00:37:02 WARNING e3.common.Signal] Signal handler (Controller.on_login_succeed) error: global name 'gui' is not defined
Traceback (most recent call last):
File "/home/hammered/Desktop/emesene2/emesene/e3/common/Signal.py", line 55, in emit
if callback(_args, *_kwargs) == False:
File "/home/hammered/Desktop/emesene2/emesene/emesene.py", line 399, in on_login_succeed
self.draw_main_screen()
File "/home/hammered/Desktop/emesene2/emesene/emesene.py", line 343, in draw_main_screen
self.tray_icon.set_main(self.session)
File "/home/hammered/Desktop/emesene2/emesene/gui/gtkui/Indicator.py", line 75, in set_main
self.menu = MainMenu(self.handler, self.main_window)
File "/home/hammered/Desktop/emesene2/emesene/gui/gtkui/Indicator.py", line 164, in init
self.list_contacts = ContactsMenu(handler, main_window)
File "/home/hammered/Desktop/emesene2/emesene/gui/gtkui/Indicator.py", line 207, in init
self.__append_contact(contact)
File "/home/hammered/Desktop/emesene2/emesene/gui/gtkui/Indicator.py", line 217, in __append_contact
pict = self.__get_contact_pixbuf_or_default(contact)
File "/home/hammered/Desktop/emesene2/emesene/gui/gtkui/Indicator.py", line 287, in __get_contact_pixbuf_or_default
pix = utils.safe_gtk_pixbuf_load(gui.theme.user,
NameError: global name 'gui' is not defined
[00:37:02 WARNING e3.common.Signal] Signal handler (Controller.on_contact_list_ready) error: 'NoneType' object has no attribute 'contact_list'
Traceback (most recent call last):
File "/home/hammered/Desktop/emesene2/emesene/e3/common/Signal.py", line 55, in emit
if callback(_args, *_kwargs) == False:
File "/home/hammered/Desktop/emesene2/emesene/emesene.py", line 450, in on_contact_list_ready
self.window.content.contact_list.fill()
AttributeError: 'NoneType' object has no attribute 'contact_list'

remember me should remember also protocol

when we choose to remember a mail, we should add also the protocol assigned with that mail.

The problem is when a mail is multi-protocol...

I use a gmail account and a hotmail account, everytime I should change protocol...

Multiple avatar chooser window instances

When i click in my avatar in the main window a avatar choose window its open, if click again in my avatar in the main window it open another avatar choose window. Its that ok?
I have multiple instances of avatar chooser window at same time.

Poor documentation [minor issue]

Hello!, well, I decided start to help in this proyect, and I found that Emesene git needs documentation for "newbies", I think that this is a issue, because people that wants to help in the proyect will have mistakes, and the purpose of this git should be have more developers.
I decided help with the wiki for the moment, because I don't know develop under python very well, and I'll try to add documentation of the structure of the proyect (besides xmind image in mesinyer/doc).
Greetings!

PS: I'm spanish, sorry if i have mistakes in the text.

[adium themes] buddy avatar

with current theme the avatar is showed correctly near bubbles, however the css header doesn't show it.

how about fixing this so users (read: me :p) can hide the avatars on right?

Personal message "None"

Having no psm causes emesene to set it to "None" on each startup, so you have to remove it manually every time you sign in.

setup.py

we need a proper setup.py so we can start i.e. making a PPA with unstable builds from hell and gain moar attention.

Content roaming doesn't work in papyon

I get this soap fault when papyon try to get my roaming profile:

soap:Bodysoap:Faultq0:BadContextTokenAuthentication failed on a call with a ticket token presenthttp://storage.msn.com:82/StorageService/v/schematizedstore.w10.asmxPassportAuthFailPassport Authorization FailedMBI6.0.5286.0/soap:Fault/soap:Body/soap:Envelope

(14:23:14) papyon.service:Unhandled SOAPFault to GetProfile

Contact list doesn't update

When a user go offline the contact list continue showing this user as online.....
Tried with emesene1 and emesene2.

Login transition

the small preference button disappearing causes a movement of the widgets when you click on connect. is this avoidable? gtk experts, it's up to YOU

e3.msn, papyon, jabber, xmpp

how about (in our ugly dropdown menu :p):

[msn/wlm]
[facebook]
[gtalk]
[generic jabber/xmpp]

with good presets?

also, do we really need to keep e3.msn since we have so little manpower?

Annoyances that won't allow to use 2.0

a) No autofocus to input box in conversation window;
b) No (custom) emoticons and text formatting, at least with adium;
c) Sounds can't be turned off;
d) Notifications and sounds are displayed/played twice sometimes;
e) No shift-enter to get a newline in input box;
f) Avatar not always updated in contact list and/or user panel and/or conversation (theme).

This is not a bug report, but more like a to-do list :)

Sort Contacts issues

Emesene seems to have issues sorting offline contacts and will not order contacts into an offline group. When the status-ordered is selected and offline contacts unhidden, it puts all the contacts into one group called online, with no offline folder.

Edit: see my comment

messaging menu exception

Traceback (most recent call last):
File "/home/riky/msn/emesene2/mesinyer/e3/common/Signals.py", line 26, in _handle_events
signal.emit(_event.args)
File "/home/riky/msn/emesene2/mesinyer/e3/common/Signal.py", line 50, in emit
if callback(_args, **kwargs) == False:
File "/home/riky/msn/emesene2/mesinyer/gui/gtkui/MessagingMenu.py", line 98, in _on_message_read
if conv.cid in self.r_indicator_dict.keys():
AttributeError: 'NoneType' object has no attribute 'cid'

mmm possible steps to reproduce it:

-> emesene2 starts conversation with buddy
-> send messages from both parties
-> send a message to emesene2, and close emesene2 conversation window (unfocused) directly

[papyon backend] nice segfault

i don't think it's papyon related, someone with l33t debugging sk1llz should take a look:

  • start a papyon session
  • before your display picture is showed, open a conversation with someone
  • segfault

logger exception

At emesene startup i get this:

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in bootstrap_inner
self.run()
File "/home/ivan/SVN/emesene2/mesinyer/e3/base/Logger.py", line 720, in run
self.logger = Logger(self.path)
File "/home/ivan/SVN/emesene2/mesinyer/e3/base/Logger.py", line 280, in __init

self.connection = sqlite.connect(os.path.join(path, "base.db"))
OperationalError: unable to open database file

steps to reproduce: start emesene

Json exception

Traceback (most recent call last):
File "/home/cando/Documenti/devs/emesene/mesinyer/gui/gtkui/TrayIcon.py", line 116, in
lambda *args: self.handler.on_disconnect_selected())
File "/home/cando/Documenti/devs/emesene/mesinyer/gui/base/Handler.py", line 42, in on_disconnect_selected
self.on_disconnect()
File "/home/cando/Documenti/devs/emesene/mesinyer/emesene.py", line 487, in on_user_disconnect
self.close_session(False)
File "/home/cando/Documenti/devs/emesene/mesinyer/emesene.py", line 210, in close_session
self.session.save_config()
File "/home/cando/Documenti/devs/emesene/mesinyer/e3/base/Session.py", line 90, in save_config
self.config.save(self.config_dir.join('config'))
File "/home/cando/Documenti/devs/emesene/mesinyer/e3/common/Config.py", line 75, in save
json.dump(values, file(path, "w"), indent=1)
File "/usr/lib/python2.6/json/init.py", line 180, in dump
for chunk in iterable:
File "/usr/lib/python2.6/json/encoder.py", line 306, in _iterencode
for chunk in self._iterencode_list(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 204, in _iterencode_list
for chunk in self._iterencode(value, markers):
File "/usr/lib/python2.6/json/encoder.py", line 306, in _iterencode
for chunk in self._iterencode_list(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 204, in _iterencode_list
for chunk in self._iterencode(value, markers):
File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
for chunk in self._iterencode_dict(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 268, in _iterencode_dict
raise TypeError("key {0!r} is not a string".format(key))
TypeError: key <class interfaces.bar.IBar at 0xaeb4cec> is not a string

everytime i try to disconnect or close emesene...

Disconects Makes Emesene unuseable

When you disconnect the emesene, the windows disappears. And if you re open it from the systray icon, a blank window appears, making it unuseable. This either happends disconnecting from "File --- Desconectar" or from the menu of the systray icon. (Note: The emesene disconnects correctly but if you want to continue using you will have to reopen it). In addition, you can't close the emesene, and the systray icon continuo existing.
Screen of the bug: http://i.imagehost.org/view/0070/disconnect_bug

Traceback (most recent call last):
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/gui/gtkui/MainMenu.py", line 77, in
lambda *args: self.handler.on_disconnect_selected())
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/gui/base/Handler.py", line 40, in on_disconnect_selected
self.on_disconnect()
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/gui/gtkui/MainWindow.py", line 205, in on_disconnect
self.on_disconnect_cb()
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/emesene.py", line 471, in on_disconnect
self.start()
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/emesene.py", line 461, in start
self.config.session, proxy, use_http, self.config.session)
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/gui/gtkui/Window.py", line 55, in go_login
proxy, use_http, session_id)
File "/home/newpc/Emesene/emesene-emesene-567115e/mesinyer/gui/gtkui/Login.py", line 84, in init
self.throbber = gtk.image_new_from_animation(th_pix)
TypeError: image_new_from_animation() argument 1 must be gtk.gdk.PixbufAnimation, not None

msn backend: 'Session' object has no attribute 'create_config'

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/home/sweetth/emesene/mesinyer/e3/msn/Worker.py", line 167, in run
self._process(data)
File "/home/sweetth/emesene/mesinyer/e3/msn/Worker.py", line 207, in _process
self._process_login(message)
File "/home/sweetth/emesene/mesinyer/e3/msn/Worker.py", line 216, in _process_login
handler(message)
File "/home/sweetth/emesene/mesinyer/e3/msn/Worker.py", line 434, in _on_login_message
self.session.create_config()
AttributeError: 'Session' object has no attribute 'create_config'

(this log is not mine, but I have the same exception, I used this one reported on emesene forum* because I can't happily copy/paste from a terminal on windows...)

I removed everything on my computer to start a fresh clone of my repo, made a rebase with emesene/emesene and tried to run emesene (without papyon).

*http://forum.emesene.org/index.php/topic,3370.msg23139.html#msg23139

NOTE: Maybe related, just before that exception, another one appears on my computer and on the reported bug on emesene's forum:
Exception in thread Thread-4:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in bootstrap_inner
self.run()
File "/home/sweetth/emesene/mesinyer/e3/base/Logger.py", line 719, in run
self.logger = Logger(self.path)
File "/home/sweetth/emesene/mesinyer/e3/base/Logger.py", line 279, in __init

self.connection = sqlite.connect(path)
OperationalError: unable to open database file

Appindicator should be used when MessagingMenu cannot...

I have removed the indicator-message package from my machine, because I don't like the Messaging menu. Current head uses the messagingmenu, but if it isn't present(like my machine) nothing is displayed in the tray. Not the old trayicon and not the new trayicon(appindicator).

I tried to detect if messaging menu isn't available, but I failed(still a noob). So I open this bug.

Preference -> Notifications config doesn't work

Notify on contact online / offline config option doesn't work.
I fix it.

diff --git a/mesinyer/e3/common/notification.py b/mesinyer/e3/common/notification.py
index d2b03cc..78e811a 100644
--- a/mesinyer/e3/common/notification.py
+++ b/mesinyer/e3/common/notification.py
@@ -49,11 +49,13 @@ class Notification():
if not contact:
return
if contact.status == status.ONLINE:

  •        text = _('is online')
    
  •        self._notify(contact, contact.nick , text)
    
  •       if self.session.config.get_or_set('b_notify_contact_online',True):
    
  •          text = _('is online')
    
  •          self._notify(contact, contact.nick , text)
     if contact.status == status.OFFLINE:
    
  •        text = _('is offline')
    
  •        self._notify(contact, contact.nick , text)
    
  •       if self.session.config.get_or_set('b_notify_contact_offline',True):  
    
  •          text = _('is offline')
    
  •          self._notify(contact, contact.nick , text)
    

    def _notify(self, contact, title, text):

Exception on Logger.py

When i start the program i get this exception.

Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in bootstrap_inner
self.run()
File "/home/erich/programacion/emesene/mesinyer/e3/base/Logger.py", line 719, in run
self.logger = Logger(self.path)
File "/home/erich/programacion/emesene/mesinyer/e3/base/Logger.py", line 279, in __init

self.connection = sqlite.connect(path)
OperationalError: unable to open database file

i'm using ubuntu 10.04

conversation exception

During a dummy session i get this:

Traceback (most recent call last):
File "/home/ivan/SVN/emesene2/mesinyer/e3/common/Signals.py", line 26, in _handle_events
signal.emit(_event.args)
File "/home/ivan/SVN/emesene2/mesinyer/e3/common/Signal.py", line 50, in emit
if callback(_args, **kwargs) == False:
TypeError: _on_message() takes exactly 5 arguments (4 given)

steps to reproduce:

  • change from adium output to text output and when you send a message there will be no more clone answer
    (even if once i get this even with adium output)

avatars in contact list

avatars in contact list does not claim (allocate) their space in the contact list.

just try making a one-line or a two-line template for the contacts in contact list and the vertical size will be based on the text, it won't care about vertical avatar space so it will be cut.

adium themes wtf

open emesene2, open emesene1.
use emesene1 to open a new conversation with emesene2.
write text, nothing will appear in the adiumtextbox, but this happens in terminal:
console message: undefined @1: ReferenceError: Can't find variable: appendMessage
console message: undefined @1: ReferenceError: Can't find variable: scrollToBottom
console message: undefined @1: ReferenceError: Can't find variable: appendMessage
console message: undefined @1: ReferenceError: Can't find variable: scrollToBottom
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.
console message: file:///home/riky/msn/emesene2/mesinyer/themes/conversations/renkoo.AdiumMessageStyle @249: TypeError: Result of expression 'insert' [null] is not an object.

if emesene2 sends a message to emesene1, the thing starts working

[Logger] Unable to open database file

Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in bootstrap_inner
self.run()
File "/home/hit/Apps/emesene2/emesene/e3/base/Logger.py", line 721, in run
self.logger = Logger(self.path)
File "/home/hit/Apps/emesene2/emesene/e3/base/Logger.py", line 281, in __init

self.connection = sqlite.connect(full_path)
OperationalError: unable to open database file

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.