ipaddress-gem / ipaddress Goto Github PK
View Code? Open in Web Editor NEWA library to handle IPv4 and IPv6 addresses in a modern and productive way.
Home Page: https://rubydoc.info/gems/ipaddress/
License: MIT License
A library to handle IPv4 and IPv6 addresses in a modern and productive way.
Home Page: https://rubydoc.info/gems/ipaddress/
License: MIT License
I noticed you have a REGEXP constant for ipv4 addresses. Do you have an equivalent for ipv6 addresses? Seems like that would be good to have too.
Please provide way to use ip addresses with ranges.
ip1 = IPAddress('192.168.10.10')
ip2 = IPAddress('192.168.30.40')
ip = IPAddress('192.168.15.20')
(ip1..ip2).include? ip
Hi,
The sample code in the documentation of each_host uses the each method instead of each_host. However, the result is correct.
Seems 0.8.0 is the latest I can depend on, can you publish the newer ones? Thank you for this gem!
similar to the ipv4 summarize.
Some IPv6 addresses in the documentation are in the 1080::/64 range. They should all be in the 2001:db8::/32 range.
Add an address_scope method (or possibly 'scope') which will return a text string describing the type of ip address (Looback, autoconfigured, Multicast, RFC1918 etc)
Anyone have objections
In the following examples I would expect the set to only have one entry and the hash to only have one key (note: if it's the same object instance you won't see this behaviour).
require 'set'
require 'ipaddress'
# works as expected
net = IPAddress.parse('192.168.0.0/24')
s = Set.new
s.add net
s.add net
puts s.length # => 1
# doesn't work as expected
s = Set.new
s.add IPAddress.parse('192.168.0.0/24')
s.add IPAddress.parse('192.168.0.0/24')
puts s.length # => 2, should be 1?
# likewise with hashes
# works as expected
net = IPAddress.parse('192.168.0.0/24')
h = {}
h[net] = true
h[net] = false
puts h.length # => 1
# doesn't work as expected
h = {}
h[IPAddress.parse('192.168.0.0/24')] = true
h[IPAddress.parse('192.168.0.0/24')] = false
puts h.length # => 2, should be 1?
a Class B network, like "10.13.0.0/16" contains 256 Class C networks [1]. consider the example code:
require 'ipaddress'
x = IPAddress('10.13.0.0/16')
c_class_count = (x.hosts.length / 256) + 1
x.split(c_class_count)
this results in the following error:
ArgumentError: New prefix must be between 16 and 32
from PATH/vendor/cache/ruby/1.9.1/gems/ipaddress-0.8.0/lib/ipaddress/ipv4.rb:684:in `subnet'
I also used "10.0.0.0/8" and reproduced the same behavior.
[1] http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#IPv4_CIDR_blocks
@bluemonk: what do you think about creating an open-source Organization named ipaddress-gem
and transferring this gem to the org.
https://github.com/account/organizations/new
This will help us to setup Travis CI for testing.
In support of this I would also setup a google group for the maintainers of this gem.
I'm not a ruby programmer ... I pull your gem into a chef recipe. After updating to gem 1.8.11, I see
uninitialized constant Gem::Deprecate
I suspect that you need something like this: https://github.com/jbarnette/isolate/pull/39/files
To reproduce
> ip_adr = IPAddress('192.168.0.1')
> ip_adr.link_local?
or
> ip_adr = IPAddress::IPv4.new('192.168.0.1')
> ip_adr.link_local?
I get this error:
NoMethodError: undefined method `link_local?' for #<IPAddress::IPv4:0x007f9c7c790a70>
from (irb):19
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/railties-4.2.8/lib/rails/commands/console.rb:110:in `start'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/railties-4.2.8/lib/rails/commands/console.rb:9:in `start'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:68:in `console'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/railties-4.2.8/lib/rails/commands.rb:17:in `<top (required)>'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:274:in `require'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:274:in `block in require'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:274:in `require'
from /Users/redapc/Sites/INSPINIA-WB0R5L90S/easyforce/bin/rails:9:in `<top (required)>'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:268:in `load'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:268:in `block in load'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.8/lib/active_support/dependencies.rb:268:in `load'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/commands/rails.rb:6:in `call'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/command_wrapper.rb:38:in `call'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:201:in `block in serve'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:171:in `fork'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:171:in `serve'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:141:in `block in run'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:135:in `loop'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:135:in `run'
from /Users/redapc/.rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in `<top (required)>'
from /Users/redapc/.rvm/rubies/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /Users/redapc/.rvm/rubies/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from -e:1:in `<main>'
ipaddress is used with the Chef Ohai component, which caused a really bizarre problem: When aws-sdk (1.51.0, the newest atm) is used to do a create_health_check request it can't correctly send xml property named "IPAddress" to the aws api.
How to reproduce with irb:
require 'ipaddress'
require 'aws-sdk'
r53 = AWS::Route53.new(:access_key_id => "....",:secret_access_key => "...",:http_wire_trace => true)
options = {:caller_reference => "foo",:health_check_config => {:ip_address => "54.84.217.101",:type => "HTTP",:resource_path => "/check"}}
r53.client.create_health_check(options)
This prints that the following data is sent to the api:
"<CreateHealthCheckRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\">\n <CallerReference>foo</CallerReference>\n <HealthCheckConfig>\n <Type>HTTP</Type>\n <ResourcePath>/check</ResourcePath>\n </HealthCheckConfig>\n</CreateHealthCheckRequest>"
(notice that there's no <IPAddress>54.84.217.101</IPAddress>
tag)
Now another irb session without ipaddress gem:
require 'aws-sdk'
r53 = AWS::Route53.new(:access_key_id => "....",:secret_access_key => "...",:http_wire_trace => true)
options = {:caller_reference => "foo",:health_check_config => {:ip_address => "54.84.217.101",:type => "HTTP",:resource_path => "/check"}}
r53.client.create_health_check(options)
prints:
"<CreateHealthCheckRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\">\n <CallerReference>foo</CallerReference>\n <HealthCheckConfig>\n <IPAddress>54.84.217.101</IPAddress>\n <Type>HTTP</Type>\n <ResourcePath>/check</ResourcePath>\n </HealthCheckConfig>\n</CreateHealthCheckRequest>"
So the ipaddress module is somehow monkey-patching something which breaks the aws-cli. the aws-cli builds the requests based on a yaml config which maps ruby property names into xml tags. Editing this yml and replacing the "IPAddress" tag definition with another name, say "IPAddress2" will result that the tag is rendered correctly.
There's at least one other user who was struct with this very same bug: https://forums.aws.amazon.com/thread.jspa?threadID=128785
IPAddress::valid_ipv4? '10.1'
=> false
$ ping 10.1
PING 10.1 (10.0.0.1): 56 data bytes
to be honest, not that critical, but still for completenes...
Hi there,
I'm tried the gem and the latest version of IPAddress from the git repository. In both cases I got an error when comparing an IPv4-address with an IPv6-address. Can you help me with suggestions to work around the problem?
[1] pry(#<ApplProxyMgt::ForwardingEntry>)> IPAddress.parse('127.0.0.1').include? IPAddress.parse('::1')
NoMethodError: undefined method `to_u32' for #<IPAddress::IPv6:0x00000005e46a38>
from /home/user/.gem/ruby/2.2.0/bundler/gems/ipaddress-ce5b52474875/lib/ipaddress/ipv4.rb:537:in `include?'
Hello:
I'm packaging this up as an RPM for Fedora (and in the future, EPEL) as a dependency for Chef, and during the packaging process I noticed that the gem has several unneeded files in it, namely .document and (arguably) the gemspec. I'm manually excluding them in the RPM but I thought I'd bring it to your attention for your next release.
/var/lib/gems/2.5.0/gems/ipaddress-0.8.3/lib/ipaddress/prefix.rb:74: warning: constant ::Fixnum is deprecated
Why is there no "private?" method for IPv6 addresses? - this is annoying because I have to manually check if the object responds to :private before calling it :(
Tested under Ruby 1.9.2p0 and Ruby 1.9.2p136:
require "ipaddress" IPAddress("1080:0000:0000:0000:0008:0800:200C:417A") == IPAddress("1080::8:800:200C:417A")
produces:
stack level too deep (SystemStackError)
It doesn't fail under Ruby 1.8.7, neither under Ruby 1.9.1p376. Maybe it's a bug in Ruby 1.9.2.
Is this really correct behaviour? It certainly wasn't the parse exception I expected.
IPAddress::parse "1"
=> #<IPAddress::IPv6:0xb73ba5bc @compressed="1::", @Prefix=128, @address="0001:0000:0000:0000:0000:0000:0000:0000", @groups=[1, 0, 0, 0, 0, 0, 0, 0]>
As a comparison,
IPAddress::parse "111111"
ArgumentError: Invalid IP "111111"
I would like a new feature.
Currently NetAddr::CIDR.create('10.0.0.1/31')[0] would give us 10.0.0.0/32 and likewise [1] gives us 10.0.0.1/32.
But I feel that NetAddr::CIDR.create('10.0.0.1/31')[-1] should also give us 10.0.0.1/32. I'm already writing code above NetAddr in a project I'm working on to do this but it would be nice to see the Gem itself support it.
Having the ability to count backwards from the end like Ruby allows us with Arrays is handy for calculating gateways and other kinds of reserved addresses.
Can we get something like this added?
IPAddress.valid?("dd")
true
As maintainer or contributor for this repo, I would like branches to be automatically tested using Travis CI.
Hi, I also stumble over issue no. 1. Could you push a new version of your gem with the commit included?
-alex
I'm trying to check if my IP is a loopback ip, I get this:
ip = IPAddress('127.0.0.1').loopback?
NoMethodError: undefined method `loopback?' for 127.0.0.1:IPAddress::IPv4
from (irb):9
from /usr/local/Cellar/ruby/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands/console.rb:47:in `start'
from /usr/local/Cellar/ruby/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands/console.rb:8:in `start'
from /usr/local/Cellar/ruby/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Any ideas?
Your RDoc link is broken.
The latest version of this gem was released on May 16, 2011, but I can see that there have been several commits since then.
Should we be using the gem or would it be better to use the Github repo in our Gemfiles? Is there any reason why the latest commits have not been bundled into the official gem?
In version 0.8.0
I get following result using .first and .last on an IPv4 /32 address:
[66] pry(main)> ip = IPAddress('192.168.1.2/32')
=> #<IPAddress::IPv4:0xc001e58
@address="192.168.1.2",
@Octets=[192, 168, 1, 2],
@Prefix=32,
@u32=3232235778>
[67] pry(main)> ip.first
=> #<IPAddress::IPv4:0xc02fed4
@address="192.168.1.3",
@Octets=[192, 168, 1, 3],
@Prefix=32,
@u32=3232235779>
[68] pry(main)> ip.last
=> #<IPAddress::IPv4:0xc052498
@address="192.168.1.1",
@Octets=[192, 168, 1, 1],
@Prefix=32,
@u32=3232235777>
When trying to create an IPAddress object for the IPv6 address ::/0 the following error occur:
ArgumentError: Prefix must be in range 1..128, got: 0
This is a result of a check done at line 217 of ipaddress/prefix.rb file.
The address ::/0 is a special case of an IPv6 address and should be considered a valid IPv6 address representation. See: http://en.wikipedia.org/wiki/IPv6_address#Default_route
as I said before, here is the bug
using ipaddress version 0.6.0
001:0> require 'ipaddress'
==> true
002:0> ip = IPAddress '192.168.1.101/255.255.255.248'
==> #<IPAddress::IPv4:0x82dff64 @address="192.168.1.101", @Prefix=29, @Octets=[192, 168, 1, 101]>
003:0> ip.first.to_s
NoMethodError: undefined method to_u32' for 29:IPAddress::Prefix from /usr/lib/ruby/gems/1.9.1/gems/ipaddress-0.6.0/lib/ipaddress/ipv4.rb:510:in
network_u32'
from /usr/lib/ruby/gems/1.9.1/gems/ipaddress-0.6.0/lib/ipaddress/ipv4.rb:356:in `first'
from (irb):3
while if I use /29 as subnet mask prefix, it works fine
=> ip = IPAddress '192.168.1.101/29'
=> ip.first.to_s
#=> "192.168.1.97"
The following sentence is in the IPAddress::IPv4#include? documentation: "Accepts either string with the IP or and IPAddress::IPv4 object." In addition to the typo ("or and"), the sentence doesn't seem accurate (the source makes it look like it needs an object, not a simple string containing the IP).
As a contributor to this repo, I would like guidelines to be identified in the root of this repo in a file named contributing.md
given a network and a host portion, is it possible for IPAddress to generate the full host address in that network? for example, if i've got an IPAddress('1.1.1.0/24')
, can i ask it for the full address of a host whose host bits are 123
(i.e. 1.1.1.123
)?
i searched various methods and did not see anything direct (yes, you can splice octets, but that only works reliably for /8
, /16
, and /24
networks). there are useful applications in templating, e.g. "i'm planning IPs for a new network, and hosts of a given role always have the host bits 123
, so please give me the full address of that host in this network"
Noticed this error during tests in an unrelated project:
/usr/local/rvm/gems/ruby-2.3.0/gems/ipaddress-0.8.3/lib/ipaddress/ipv6.rb:437: warning: method redefined; discarding old link_local?
/usr/local/rvm/gems/ruby-2.3.0/gems/ipaddress-0.8.3/lib/ipaddress/ipv6.rb:405: warning: previous definition of link_local? was here
Seems link_local?
is defined twice in lib/ipaddress/ipv6.rb
https://github.com/ipaddress-gem/ipaddress/blob/master/lib/ipaddress/ipv6.rb#L405
#
# Returns true if the address is a link local address
#
def link_local?
@groups[0] == 0xfe80
end
https://github.com/ipaddress-gem/ipaddress/blob/master/lib/ipaddress/ipv6.rb#L437
#
# Checks if an IPv6 address objects belongs
# to a link-local network RFC4291
#
# Example:
#
# ip = IPAddress "fe80::1"
# ip.link_local?
# #=> true
#
def link_local?
[self.class.new("fe80::/64")].any? {|i| i.include? self}
end
Hi,
We're currently using the NetAddr gem to provide our software with supernet, subnet and IP Address management. An example of this as follows:
ruby-1.9.2-p180 :004 > Supernet.create(:network => '192.168.0.0', :cidr => '20')
=> 192.168.0.0/20
ruby-1.9.2-p180 :005 > Vlan.first.allocate_subnet(29)
=> 192.168.0.0/29
ruby-1.9.2-p180 :006 > Vlan.first.allocate_subnet(28)
=> 192.168.0.16/28
ruby-1.9.2-p180 :007 > Vlan.first.allocate_subnet(27)
=> 192.168.0.32/27
ruby-1.9.2-p180 :008 > Vlan.first.allocate_subnet(29)
=> 192.168.0.8/29
ruby-1.9.2-p180 :009 >
We use the allocate_rfc351 function in NetADDR::CIDR to do this currently, but would like to use your library as it has a lot nicer API. Would you be able to duplicate the functionality in your better API?
Thanks
Some changes have been made to a gem since v0.8.3. One of them is fixing the issue with IPv4#<=> (#76) which is important for what I'm currently doing (I'm forced to put a hack in my code to avoid it). So when do you plan to issue a new gem version?
There is lots of issues, PRs and etc. There is initiative people.
But everything ends on repository owner absence. He even ignores emails.
Considering this gem is quite popular and used in many projects i think community should take care of it.
Here is dispute on ruby gems to move gem ownership to community:
http://help.rubygems.org/discussions/suggestions/7851-reporting-abuse-on-ipaddress-author-missing
Hello community,
i got a problem with the IPAddress lib, i dont know if it's a bug, or just a mistake from me.
I have this address ' 46.17.68.76/31 ', i want to have the broadcast addess, then i make :
network = "46.17.68.76/31"
@ip = IPAddress.parse(network)
puts @ip.broadcast
the output : @address="255.255.255.255"
but for me the broadcast address for ' 46.17.68.76/31 ' is : 46.17.68.77
Thank's for your help!
Hi,
I'm not sure if this is the expected behavior:
> IPAddress.parse("01:1c:43:10:20:0a")
=> #<IPAddress::IPv6:0x007fd780b9a1b8 @groups=[1, 28, 67, 16, 32, 10, 0, 0], @address="0001:001c:0043:0010:0020:000a:0000:0000", @compressed="1:1c:43:10:20:a::", @prefix=128>
In my understanding, the representation of an IPv6 address must either be fully qualified (7 colons) or there must be two consecutive colons (::) for zero padding. The mac address has only 5 colons and parse() pads it with trailing zeros.
So shouldn't it better fail?
I'm using ipaddress 0.8.0 with ruby 2.1.5.
Thanks,
Oliver
When I change a value in .octets I expect the .address to be changes. Than doesn't occur.
Version 0.8.0 is used.
realloc@support01:/var/tmp$ irb
1.9.3-p194 :001 > require 'ipaddress'
=> true
1.9.3-p194 :002 > ip = IPAddress("172.16.10.1/24")
=> 172.16.10.1
1.9.3-p194 :003 > ip.address
=> "172.16.10.1"
1.9.3-p194 :004 > ip.octets[2]=11
=> 11
1.9.3-p194 :005 > ip.address
=> "172.16.10.1"
1.9.3-p194 :006 > ip[2]
=> 11
1.9.3-p194 :007 >
Hi guys,
i have found a bug.
It is allowed to use dot notation in ipv6. The following address is not a mapped ipv6 address.
IPAddress.parse('abcd:9234::1.2.3.4/96').to_string
I got a wrong output
=> ::ffff:9.2.3.4/96
But the correct output must be:
=> abcd:9234::102:304/96
Same problem here:
IPAddress.parse('::1.2.3.4/120').to_string
=> "::ffff:1.2.3.4/120"
Correct output is
=> ::102:304/120
Only
IPAddress.parse('::ffff:1.2.3.4/120') is a mapped ipv6 value!
Only here it is allowed to handle it as an Mapped IPv6 Object with the following output:
=> "::ffff:1.2.3.4/120"
The IPAddress gem abuses the Enumerable mixin. One example is the each
method. That method will always yield at least one value, which causes problems for other Ruby code that assumes an Enumerable cannot contain itself. For example, the following snippet will trigger a stack overflow:
require 'ipaddress'
require 'active_support/json'
IPAddress.parse("1.2.3.4/32").as_json
The best solution would be to draw a distinction between an address and a network, like Python3's ipaddress module. If that were the case, then IPNetwork#each
would yield a bunch of IPAddress
objects, which would not implement #each
.
A smaller change that wouldn't break compatibility with existing IPAddress users to be to define an as_json
method which would simply call to_string
.
I think checking 169.254.*.*
for self_assigned?
would be useful.
Also ideally, global?
to find out if the IP is reachable from Internet would be awesome, if possible.
What do you think?
Hi,
I encountered an issue about the execution time of each_host in ipv4 (I have not checked for ipv6)
If you replace the code of each_host by tu same one as the one from each, the execution time is twice faster. Indeed, each_hosts uses "hosts" which itself calls each. Therefore, the array is iterated over twice.
By replacing the code likewise, the array is just iterated over once:
def each_host
(network_u32 + 1..broadcast_u32 - 1).each do |i|
yield self.class.parse_u32(i, @prefix)
end
end
Here is the example code. Just replace each_host by host and see the execution time difference:
require 'rubygems'
require 'ipaddress'
ip = IPAddress "10.8.0.0/14"
ip.each_host do |ip|
ip
end
As a contributor or maintainer, I would like to be able to assess code coverage for tests.
Thanks for this gem. I have an IPv6 /64 where I want to get a random IP from, what's the most efficient way to do this?
We store IP addresses in our database as integers. I am looking at replacing IPAddr with IPAddress, but I can not find a method to convert fixnum to dot notation. Does one exist? If not, is one on the roadmap?
The IPAddr way to achieve dot notation from integer:
IPAddr.new([fixnum], Socket::AF_INET).to_s
There's a small problem in https://github.com/bluemonk/ipaddress/blob/master/lib/ipaddress.rb#L217.
This regular expression is matching not only Ruby 1.8, but also 2.1.8. Because of that, when you upgrade to any Ruby with a version similar to x.1.8, you'll get a ton of warnings similar to:
.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/sprockets-2.11.3/lib/sprockets/mime.rb:25: warning: Hash#index is deprecated; use Hash#key
That code is correctly using Hash#key, but due to the alias
made in
https://github.com/bluemonk/ipaddress/blob/master/lib/ipaddress.rb#L219
Hash#key becomes an alias to Hash#index and actually Hash#index is called, which results in a lot of depreciation warnings.
Would be nice if ipaddress.version returned a 4 or a 6 so we don't have to just use ipv4? and ipv6?.
The last commit was almost 9 months ago, and there are 26 open issues, many of which have no response, and some of which provide pull-requests that have not been incorporated.
Is there an alternative gem for handling IP addresses or does IPAddr make this one redundant?
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.