phatina / python-lmiwbem Goto Github PK
View Code? Open in Web Editor NEWLMIWBEM is a Python library, which performs CIM operations using CIM-XML protocol.
Home Page: http://www.openlmi.org
License: GNU Lesser General Public License v2.1
LMIWBEM is a Python library, which performs CIM operations using CIM-XML protocol.
Home Page: http://www.openlmi.org
License: GNU Lesser General Public License v2.1
WBEMConnection::WBEMConnection(...) constructor accepts no_verification but then it's value used as following:
bool c_verify = Conv::as(no_verification, "no_verification");
client()->setVerifyCertificate(c_verify);
It's opposite to WBEMConnection::connect(...):
bool c_no_verify = Conv::as(no_verification, "no_verification");
client()->setVerifyCertificate(!c_no_verify);
It's impossible to disable default trust store with lmiwbem 0.7.1.
lmiwbem.config.DEFAULT_TRUST_STORE = ''
I have a test executed against single broker on local system that launches three processes. In 1 of 2 cases, it fails with errors like "Pegasus: Mismatched response message type."
. The weird thing is that the issue does not exhibit once the pywbem library is used instead - with the same version of openlmi-tools
and tog-pegasus
You can find mentioned test in git repository at fedorahosted.
My testing configuration is:
Here's one example of test run:
test_parallel_install (test_software_installation_job.TestSoftwareInstallationJob) ... Process Process-2:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 797, in _do_test_single_pkg_install
rval, oparms, _ = self.service_op.InstallFromSoftwareIdentity(
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 288, in service_op
self._service_op = self.ns.LMI_SoftwareInstallationService \
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 337, in first_instance
return inst_name.to_instance() if inst_name else None
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 228, in wrapper
return fn(self_wr, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIInstanceName.py", line 560, in to_instance
self._cim_instance_name, LocalOnly=False)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 293, in get_instance
PropertyList=PropertyList))
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 319, in wrapped
lmi_raise_or_dump_exception(cim_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 285, in get_instance_core
rval=self._cliconn.GetInstance(path, **kwargs))
CIMError: GetInstance LMI_SoftwareInstallationService: Pegasus: Mismatched response message type.
Process Process-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 797, in _do_test_single_pkg_install
rval, oparms, _ = self.service_op.InstallFromSoftwareIdentity(
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 288, in service_op
self._service_op = self.ns.LMI_SoftwareInstallationService \
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 336, in first_instance
inst_name = self.first_instance_name(inst_filter, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 269, in first_instance_name
**kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 226, in get_instance_names
classname, namespace)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 319, in wrapped
lmi_raise_or_dump_exception(cim_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 204, in get_instance_names_core
classname, namespace))
CIMError: EnumerateInstanceNames LMI_SoftwareInstallationService: Pegasus: Mismatched response message type.
Process Process-1:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 797, in _do_test_single_pkg_install
rval, oparms, _ = self.service_op.InstallFromSoftwareIdentity(
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 288, in service_op
self._service_op = self.ns.LMI_SoftwareInstallationService \
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 336, in first_instance
inst_name = self.first_instance_name(inst_filter, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 269, in first_instance_name
**kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 226, in get_instance_names
classname, namespace)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 319, in wrapped
lmi_raise_or_dump_exception(cim_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 204, in get_instance_names_core
classname, namespace))
CIMError: EnumerateInstanceNames LMI_SoftwareInstallationService: Pegasus: Connection closed by CIM Server.
FAIL
and another:
test_parallel_install (test_software_installation_job.TestSoftwareInstallationJob) ... Process Process-2:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 797, in _do_test_single_pkg_install
rval, oparms, _ = self.service_op.InstallFromSoftwareIdentity(
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 288, in service_op
self._service_op = self.ns.LMI_SoftwareInstallationService \
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 336, in first_instance
inst_name = self.first_instance_name(inst_filter, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 269, in first_instance_name
**kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 226, in get_instance_names
classname, namespace)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 319, in wrapped
lmi_raise_or_dump_exception(cim_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 204, in get_instance_names_core
classname, namespace))
CIMError: EnumerateInstanceNames LMI_SoftwareInstallationService: Pegasus: Mismatched response message type.
Process Process-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 797, in _do_test_single_pkg_install
rval, oparms, _ = self.service_op.InstallFromSoftwareIdentity(
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 288, in service_op
self._service_op = self.ns.LMI_SoftwareInstallationService \
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIClass.py", line 337, in first_instance
return inst_name.to_instance() if inst_name else None
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 228, in wrapper
return fn(self_wr, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIInstanceName.py", line 560, in to_instance
self._cim_instance_name, LocalOnly=False)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 293, in get_instance
PropertyList=PropertyList))
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 319, in wrapped
lmi_raise_or_dump_exception(cim_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 285, in get_instance_core
rval=self._cliconn.GetInstance(path, **kwargs))
CIMError: GetInstance LMI_SoftwareInstallationService: Pegasus: Mismatched response message type.
Process Process-1:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/root/workspace/openlmi-providers/src/python/lmi/test/lmibase.py", line 48, in _wrapper
retval = method(*args, **kwargs)
File "/root/workspace/openlmi-providers/src/software/test/test_software_installation_job.py", line 798, in _do_test_single_pkg_install
**input_parameters)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIMethod.py", line 653, in __call__
self._lmi_instance, self._method_name, **method_args)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 508, in call_method
return call_method_core(path, method, **params)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 323, in wrapped
lmi_raise_or_dump_exception(conn_error)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMIDecorators.py", line 316, in wrapped
rval = fn(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/lmi/shell/LMICIMXMLClient.py", line 504, in call_method_core
rval, rparams = self._cliconn.InvokeMethod(method, path, **params)
ConnectionError: (24, 'InvokeMethod InstallFromSoftwareIdentity: connection timed out')
FAIL
Upcoming Pegasus 2.14 will implement PULL operations. This is a friendly reminder that we need to support it also lmiwbem.
In short, there will be number of new intrinsic method to enumerate stuff (instances, instance names, references, associators, ...). Instead of returning all instances / instance names in one huge XML, it will return just first X elements and the client can iteratively pull another X elements, until the enumeration is complete.
Example of EnumerateInstances using PULL operations in lmishell-like pseudolanguage:
enumeration_ctx = c.root.cimv2.LMI_Service.OpenEnumerateInstances()
while not enumeration_ctx.empty():
instances = enumeration_ctx.PullInstances(MaxObjectCount = 10)
# process just 10 instances
enumeration_ctx.CloseEnumeration()
This is just an idea, proper API has to be designed.
e.g. all this EnumerationContext could be hidden inside a generator and application would just iterate using:
for i in LMI_Service.new_cool_instances(chunk_size=10):
See http://www.dmtf.org/sites/default/files/standards/documents/DSP0200_1.3.1.pdf for all methods and their parameters.
Pegasus will have all these intrinsic methods exposed in its client library.
It would be very useful for consumers of lmiwbem to be able to pass return codes into a generic cim_is_error() function. The major advantage would be that their code could be written to be flexible if the error codes that a function can return ever changes (adds new errors).
Hello,
I'm running OS X El Capitan, and I tried to follow the installation instruction, but when I ran ../configure
I the build tool reported that my platform is not supported.
Screenshot: https://www.evernote.com/l/Af0vrur2ip1L6qmok5klid-pD8_ocxTautY
Am I doing something wrong or is there a plan to support OS X?
Currently lmiwbem takes an instance whose path is filled manually as illustarted below for createInstance. A user has to manually filled those values,which are extraneous.
To be more compatible with other client like pywbem and pegasus CIM Client.
Will it be possible to change create instance to accept CIMInstance without requiring path set and asking user to set namespace. if the user does not supply the namespace assumed the default one.
This is lighten the task a bit on users and migrating code from pywbem and also simplify lmiwbem code.
member_of_group = lmiwbem.CIMInstance(
"LMI_MemberOfGroup",
lmiwbem.NocaseDict({
"Member" : identity_iname,
"Collection" : group_iname}),No qualifiers
None,
lmiwbem.CIMInstanceName(
"LMI_MemberOfGroup",
# No keybindings; Member and Collection are not key properties in
# LMI_MemberOfGroup
None,
hostname,
"root/cimv2"))new_iname = conn.CreateInstance(member_of_group)
The latest release of lmiwbem 0.3.1 breaks on rpm build due to a typo(Fro).
Also
NOT YET fixed and required for building on RHEL 6.4 are requirement on python-sphinx, which is missing on RHEL 6.4
Currently, lmiwbem seems to perform operations and returns results and exception is thrown in case of error.
There is is_error to check the error which I misses to see usage example.
Will it make sense to return status along with results eg
status, data = conn.EnumerateInstances(.....) # Status can either be Boolean or Error code
if status:
# use the data
else:
# Don't trust the data
Please suggest me if this can be done through is_error which I may have missed to use
We are almost in the final stage of having lmiwbem as a drop-in replacement of pywbem.
We used a product whose code we can not change and the code uses
instance.items()
and what we encountered is a difference in the data packing. lmiwbem have
propertyName, CIMProperty pair as tuple
whereas pywbem has
propertyName, valuel[0].items()
[('AvailableRequestedStates', CIMProperty(name='AvailableRequestedStates',
type='uint16', value='[]', is_array=True, ...)), ('Caption',
CIMProperty(name='Caption', type='string', value='None', is_array=False, ...)),
+-- 42 lines: ('CommunicationStatus', CIMProperty(name='CommunicationStatus', type='uint16',-------------------------------------
CIMProperty(name='TransitioningToState', type='uint16', value='12',
is_array=False, ...))]
p[0].items()
[(u'RequestedState', 12L), (u'HealthState', None), (u'StatusDescriptions',
None), (u'TransitioningToState', 12L), (u'CommunicationStatus', None),
(u'SystemName', u'ibm-rm1.persistent.co.in'), (u'PrimaryOwnerName', None),
(u'DetailedStatus', None), (u'GatherStatisticalData', False), (u'Started',
True), (u'OperationalStatus', [2L]), (u'PrimaryOwnerContact', None),
(u'SystemCreationClassName', u'PG_ComputerSystem'), (u'Status', None),
(u'Description', u'Pegasus CIM Server Version 2.14.0 Development'),
(u'InstallDate', None), (u'EnabledDefault', 2L), (u'EnabledState', 5L),
(u'TimeOfLastStateChange', None), (u'CreationClassName', u'PG_ObjectManager'),
(u'StartMode', None), (u'PrimaryStatus', None), (u'ElementName', u'Pegasus'),
(u'Name', u'PG:10-44-78-9'), (u'OtherEnabledState', None), (u'InstanceID',
None), (u'Caption', None), (u'OperatingStatus', None),
(u'AvailableRequestedStates', None)]
Our request is if we can have same format, it will be easy to replace or
is there any other way to get the required format that we have missed to try?
Thanks for the great work, Peter.
We are currently using pywbem for one of our projects and we saw lmiwbem as a better option.
Few things which users would certainly appreciate is having some facility to do SLP discovery in lmiwbem.
Also, if we have some way to switch on/off features like CIMListener will be another value add.
Hi Peter
Currently, lmiwbem by default installs in the site-packages of the python installed on the system.
Will it be possible to have an option to install in folder specified by user, for example,
We would like to install the so and py files in lib
folder of our code directory.
If we can have a setup.py to do the same, That will help a lot.
May be this option is possible using the configure script which I am not aware of. If this is the case, Please instruct me.
Was trying to learn and use lmiwbem on ubuntu and got the following load error.
root@deleisha:/home/deleisha/Codespace/lmiwbem# python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import lmiwbem
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python2.7/dist-packages/lmiwbem/init.py", line 75, in
from lmiwbem_core import *
ImportError: /usr/lib/python2.7/dist-packages/lmiwbem/lmiwbem_core.so: undefined symbol: _ZN12CIMConstants28CON_ERR_CANNOT_CREATE_SOCKETEKeyboardInterrupt
I tried to build the project with python3 support, but the build failed.
Environment:
../configure --with-listener=no --with-slp=no --with-python3=yes
I encountered the following errors.
The make phase produced the following error:
../../src/obj/cim/lmiwbem_property.cpp: In member function 'bool CIMProperty::eq(const boost::python::api::object&)':
../../src/obj/cim/lmiwbem_property.cpp:257:26: error: 'getValue' was not declared in this scope
compare(getValue(), cim_other.getValue(), Py_EQ) &&
^
../../src/obj/cim/lmiwbem_property.cpp:257:39: error: 'class CIMProperty' has no member named 'getValue'
compare(getValue(), cim_other.getValue(), Py_EQ) &&
^
../../src/obj/cim/lmiwbem_property.cpp: In member function 'bool CIMProperty::gt(const boost::python::api::object&)':
../../src/obj/cim/lmiwbem_property.cpp:275:26: error: 'getValue' was not declared in this scope
compare(getValue(), cim_other.getValue(), Py_GT) ||
^
../../src/obj/cim/lmiwbem_property.cpp:275:39: error: 'class CIMProperty' has no member named 'getValue'
compare(getValue(), cim_other.getValue(), Py_GT) ||
^
../../src/obj/cim/lmiwbem_property.cpp: In member function 'bool CIMProperty::lt(const boost::python::api::object&)':
../../src/obj/cim/lmiwbem_property.cpp:293:26: error: 'getValue' was not declared in this scope
compare(getValue(), cim_other.getValue(), Py_LT) ||
^
../../src/obj/cim/lmiwbem_property.cpp:293:39: error: 'class CIMProperty' has no member named 'getValue'
compare(getValue(), cim_other.getValue(), Py_LT) ||
The problem is that in lmiwbem_property.cpp the methods CIMProperty::eq
, CIMProperty::gt
, CIMProperty::lt
are only built for Python3, and they contain similar lines:
compare(getValue(), cim_other.getValue(), Py_EQ) &&
getValue() is not defined. If I change them to getPyValue(), then the code compiles (but I do not know the code of lmiwbem enough to see whether this is the intended behavior).
The next error is the following:
../../src/util/lmiwbem_convert.cpp: In static member function 'static boost::python::api::object ObjectConv::asPyUnicode(const boost::python::api::object&)':
../../src/util/lmiwbem_convert.cpp:340:62: error: 'PyObject_Unicode' was not declared in this scope
return bp::object(bp::handle<>(PyObject_Unicode(obj.ptr())));
In Python 3.x as far as I can see PyObject_Unicode
was removed (see https://docs.python.org/3.4/c-api/object.html).
After commenting out the ObjectConv::asPyUnicode method, compiling finishes.
Next is a linker error:
/bin/ld: cannot find -l-L/usr/lib/gcc/x86_64-redhat-linux/4.8.2
collect2: error: ld returned 1 exit status
make[2]: *** [lmiwbem_core.la] Error 1
make[2]: Leaving directory `/root/lmiwbem-master/build/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/lmiwbem-master/build'
make: *** [all] Error 2
The problem is that the generated makefile (build/src/makefile) contains the following line:
lmiwbem_core_la_LIBADD = -lpegcommon -lpegclient \
-L/opt/rh/python33/root/usr/lib64 -lpython3.3m -l $(am__append_4) \
$(am__append_5) $(am__append_8)
The extra -l
is not needed there. I could not trace back why this empty -l
is generated there, probably a module was not found in my setup.
I tried also python setup.py install
, but in setup.py.in there is a print using python 2.x syntax. It could be changed to print():
diff --git a/setup.py.in b/setup.py.in
index baef49b..ad74d0e 100644
--- a/setup.py.in
+++ b/setup.py.in
@@ -88,7 +88,7 @@ class lmiwbem_build(build):
# Generate pydoc headers
for pydoc, header in zip(pydocs, headers):
- print 'docgen %s %s' % (pydoc, header)
+ print('docgen %s %s' % (pydoc, header))
subprocess.check_call([lmiwbem_docgen, pydoc, header])
def teardown(self):
It could be noted in the readme, that if building for python3, then the boost_python3 version of boost_python is needed (it is not trivial in some distributions).
When we were trying to delete an existing subscription handler, lmiwbem reports
CIMError: (6, 'CIM_ERR_NOT_FOUND:
More details at following transactions:
-> conn.GetInstance(iname)
(Pdb)
(Pdb) n
CIMError: (6, 'CIM_ERR_NOT_FOUND: >CIM_ListenerDestinationCIMXML.CreationClassName="CIM_ListenerDestinationCIMXML...calhost/CIMListener/Pegasus_ProviderLifecycleIndicationConsumer",Name="PLIHandler01",SystemName=""')
/home/deleisha/CodeSpace/pegasus/lmiwbem-debug.py(36)()
-> conn.GetInstance(iname)(Pdb) iname
CIMInstanceName(classname='CIM_ListenerDestinationCIMXML', keybindings=NocaseDict({'CreationClassName': 'CIM_ListenerDestinationCIMXML', 'Destination': 'localhost/CIMListener/Pegasus_ProviderLifecycleIndicationConsumer', 'Name': 'PLIHandler01', 'SystemCreationClassName': 'CIM_ComputerSystem', 'SystemName': 'ibm-rm1.persistent.co.in'}), host='10.44.78.9', namespace='root/PG_Interop')(Pdb) i = conn.EnumerateInstances('CIM_ListenerDestinationCIMXML', 'root/pg_interop')
(Pdb) i
CIMInstance(classname='CIM_ListenerDestinationCIMXML', ...) i[0].path
CIMInstanceName(classname='CIM_ListenerDestinationCIMXML', keybindings=NocaseDict({'CreationClassName': 'CIM_ListenerDestinationCIMXML', 'Name': 'PLIHandler01', 'SystemCreationClassName': 'CIM_ComputerSystem', 'SystemName': 'ibm-rm1.persistent.co.in'}), namespace='root/pg_interop')
(Pdb)
Please consider adding requestAcceptLanguages property to a connection.
With the proposed implementation (#13) you can use it as follows:
conn = lmiwbem.WBEMConnection()
conn.connectLocally()
conn.requestAcceptLanguages = [('ru', 1.0), ('en', 0.5)]
print conn.requestAcceptLanguages
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.