Giter Club home page Giter Club logo

Comments (15)

ysbaddaden avatar ysbaddaden commented on May 18, 2024

You probably run a systemd based Ubuntu, which Prax doesn't support (I know nothing about it).

You may try to access http://users.test:20559 to check if Prax works, then try sudo /etc/init.d/prax restart to add the port redirections rules (port 80 to 20559, and 443 to 20558).

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

@ysbaddaden no luck. Any plans for systemd support? it is the most popular init system.

from prax.cr.

ysbaddaden avatar ysbaddaden commented on May 18, 2024

If http://users.test:20559 doesn't work, then it's not related to systemd.

  1. prax stop; prax start --verbose should restart Prax (in the foreground, with verbose output);
  2. ps ax | grep prax should print /opt/prax/bin/prax-binary as running (or a similar path);
  3. netstat -atn | grep :20559 should print something;
  4. opening http://localhost:20559 should greet you with a Prax splash page (you can try alternative local IPs).

If any of these is failing, then Prax is indeed broken :(

If prax is running, lsof -p <prax pid> should print some useful information (e.g. which sockets are opened). For example:

$ ps afx | grep prax
16271 pts/13   Sl+    0:00 /opt/prax/bin/prax-binary --verbose
$ netstat -atn | grep :20559
tcp6       0      0 :::20559                :::*                    LISTEN
$ lsof -p 16271
prax-bina 16271 julien   12u  IPv6            1675586      0t0      TCP *:20559 (LISTEN)
prax-bina 16271 julien   13u  IPv6            1675587      0t0      TCP *:20558 (LISTEN)

from prax.cr.

tijn avatar tijn commented on May 18, 2024

@bbtdev here you can find systemd scripts and a README. I wrote it for Arch Linux but it's probably useful on any other distro with systemd.

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

I did a fresh install, ruby, everything:

vagrant@vagrant-VirtualBox:~$ sudo dpkg -i Downloads/prax_0.8.0-1_amd64.deb 
Selecting previously unselected package prax.
(Reading database ... 126619 files and directories currently installed.)
Preparing to unpack .../prax_0.8.0-1_amd64.deb ...
Unpacking prax (0.8.0-1) ...
Setting up prax (0.8.0-1) ...
Processing triggers for systemd (239-7ubuntu10) ...
vagrant@vagrant-VirtualBox:~$ prax
Usage: prax <command> [<args>]

Some useful prax commands are:
   certificate  Self-sign SSL certificates
   cleanup      Removes all invalid links in ~/.prax
   commands     List all prax commands
   iptables     Sets or removes network port redirection rules (requires root...
   link         Link a Rack application to ~/.prax
   list         Lists all linked hosts in ~/.prax
   log          Tails the Prax log for the current Rack app
   open         Open a Rack application in browser
   restart      Restart the current Rack application
   start        Start Prax proxy server
   stop         Stop Prax proxy server
   unlink       Unlinks a Rack application from ~/.prax

See 'prax help <command>' for information on a specific command.
vagrant@vagrant-VirtualBox:~$ cd projects/users/
vagrant@vagrant-VirtualBox:~/projects/users$ mkdir ~/.prax
vagrant@vagrant-VirtualBox:~/projects/users$ prax link
ln -s '/home/vagrant/projects/users' '/home/vagrant/.prax/users'

vagrant@vagrant-VirtualBox:~/projects/users$ prax start
/opt/prax/bin/prax-binary: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

vagrant@vagrant-VirtualBox:~/projects/users$ sudo gdebi ~/Downloads/compat-libevent2-5_2.0.21-1ubuntu18_amd64.deb 
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Reading state information... Done

No description
Do you want to install the software package? [y/N]:y
Selecting previously unselected package compat-libevent2-5.
(Reading database ... 132994 files and directories currently installed.)
Preparing to unpack .../compat-libevent2-5_2.0.21-1ubuntu18_amd64.deb ...
Unpacking compat-libevent2-5 (2.0.21-1ubuntu18) ...
Setting up compat-libevent2-5 (2.0.21-1ubuntu18) 

vagrant@vagrant-VirtualBox:~/projects/users$ prax stop; prax start --verbose
I, [2018-11-09 23:10:32 -06:00 #4349]  INFO -- prax: binding to [::]:20559

# new tab
vagrant@vagrant-VirtualBox:~/projects/users$ ps ax | grep prax
 4349 pts/0    S+     0:00 /opt/prax/bin/prax-binary --verbose
 4435 pts/1    S+     0:00 grep --color=auto prax
vagrant@vagrant-VirtualBox:~/projects/users$ sudo apt install net-tools
vagrant@vagrant-VirtualBox:~/projects/users$ netstat -atn | grep :20559
tcp6       0      0 :::20559                :::*                    LISTEN 

agrant@vagrant-VirtualBox:~/projects/users$ lsof -p 4349
COMMAND    PID    USER   FD      TYPE             DEVICE SIZE/OFF   NODE NAME
prax-bina 4349 vagrant  cwd       DIR                8,1     4096   6088 /opt/prax
prax-bina 4349 vagrant  rtd       DIR                8,1     4096      2 /
prax-bina 4349 vagrant  txt       REG                8,1  1757181   6112 /opt/prax/bin/prax-binary
prax-bina 4349 vagrant  mem       REG                8,1  1996592 400592 /lib/x86_64-linux-gnu/libc-2.28.so
prax-bina 4349 vagrant  mem       REG                8,1   100712 400627 /lib/x86_64-linux-gnu/libgcc_s.so.1
prax-bina 4349 vagrant  mem       REG                8,1    18656 400613 /lib/x86_64-linux-gnu/libdl-2.28.so
prax-bina 4349 vagrant  mem       REG                8,1   285072  11905 /usr/lib/x86_64-linux-gnu/libevent-2.0.so.5.1.9
prax-bina 4349 vagrant  mem       REG                8,1   149696 400722 /lib/x86_64-linux-gnu/libpthread-2.28.so
prax-bina 4349 vagrant  mem       REG                8,1  1623216 400653 /lib/x86_64-linux-gnu/libm-2.28.so
prax-bina 4349 vagrant  mem       REG                8,1   468944 400711 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
prax-bina 4349 vagrant  mem       REG                8,1  2357760   3799 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
prax-bina 4349 vagrant  mem       REG                8,1   426232   4583 /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0
prax-bina 4349 vagrant  mem       REG                8,1   174936 400566 /lib/x86_64-linux-gnu/ld-2.28.so
prax-bina 4349 vagrant    0u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    1u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    2u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    3u  a_inode               0,13        0   9689 [eventpoll]
prax-bina 4349 vagrant    4u     unix 0x0000000000000000      0t0  40781 type=STREAM
prax-bina 4349 vagrant    5u     unix 0x0000000000000000      0t0  40782 type=STREAM
prax-bina 4349 vagrant    6u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    7u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    8u      CHR              136,0      0t0      3 /dev/pts/0
prax-bina 4349 vagrant    9r     FIFO               0,12      0t0  40787 pipe
prax-bina 4349 vagrant   10w     FIFO               0,12      0t0  40787 pipe
prax-bina 4349 vagrant   11u     IPv6              40788      0t0    TCP *:20559 (LISTEN)

No luck with:
http://users.test:20559
https://users.test:20559
http://www.users.test:20559
https://www.users.test:20559

I tried also with rails server and without. Is prax supposed to start the server or I am?

@tijn that's really cool. I should try when I get users.test:20559 to work, there is no point otherwise, right? Also can it be used with .test?

from prax.cr.

tijn avatar tijn commented on May 18, 2024

@bbtdev yes, .test works fine. That's how I use it.

Sorry if I'm stating the obvious but could it be that you have missed the dnsmasq settings that makes the traffic to .test go to localhost? Or maybe it has a typo that makes it fail?

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

@tijn sorry I suck at this.

I looked here https://github.com/ysbaddaden/prax.cr/wiki/User-Guide about how to use it. Am i suppose to install dnsmasq? And where can I find the settings I need to insert?

Just to be clear, are we talking about 'vanilla' prax.cr, or your guide? I didn't use your guide because first I have to get users.test:20559 to work. no?

from prax.cr.

tijn avatar tijn commented on May 18, 2024

@bbtdev indeed, you need to install dnsmasq.

You can use either guide because they all describe the same steps, but I think you might benefit from reading my guide or this version because I numbered the 3 things you need to accomplish to get it working. But the README in the root of the repo is saying the exact same things using different words.

They key is to find the text that clicks with you to understand the main points. This will help you in deciding how to deal with different distros/init systems/TLDs/ports/...

from prax.cr.

ysbaddaden avatar ysbaddaden commented on May 18, 2024

Great, Prax started and is running correctly. It's listening on all interfaces (ip4, ip6) on port 20559. Now, either http://localhost:20559/ or http://127.0.0.1:20559/ should display the Prax splash page.

You may try http://localhost/ or http://127.0.0.1/ to check if the port redirection is working.

Now, what doesn't work may be 2 things:

  1. the DNS resolver, to resolve *.test and *.localhost as 127.0.0.1 and ::1;
  2. port forwarding, to forward the :80 and :443 ports to :20559 and :20558.

The deb package adds a dnsmasq configuration to NetworkManager in /etc/NetworkManager/dnsmasq.d/prax. It works on Ubuntu 14.04, but systemd took over DNS, so maybe it doesn't work on later Ubuntu releases (sigh). Note that you may use the http://xip.io/ resolver as a workaround, for example http://users.127.0.0.1.xip.io:20559/ to check whether Prax works.

The guide by @tjin can definitely help to figure out how to fix the NetworkManager/dnsmasq configuration, and an alternative script to setup the iptables rules for port redirections. Or maybe systemd is getting in the way again?

I'm sorry that the installation isn't smooth. I'm still using Ubuntu 14.04 and I'm not interested into trying out later releases, and will most probably switch to another distro (AlpineLinux) when it goes out of LTS.

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

It work(yay, thank you), until I restarted. Dnsmasq does not want to start:

dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2018-11-12 01:45:24 CST; 16s ago
  Process: 2849 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=5)
  Process: 2838 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)

Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server...
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2838]: dnsmasq: syntax check OK.
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: dnsmasq: directory /etc/resolv.conf for resolv-file is missing, cannot poll
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: dnsmasq.service: Control process exited, code=exited status=5
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: directory /etc/resolv.conf for resolv-file is missing, cannot poll
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: dnsmasq.service: Failed with result 'exit-code'.
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: FAILED to start up
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: Failed to start dnsmasq - A lightweight DHCP and caching DNS server.

Found a way to start it, but now my internet does not work, neither does prax. To install dnsmasq I had to disable systemd-resolved(the whole flow is below).
@tjin how did you manage the systemd-resolved and dnsmasq incompatibility? Do you have both services enabled?

Installing and starting dnsmasq

vagrant@vagrant-VirtualBox:~/projects/users$ ps aux | grep dns
vagrant  12475  0.0  0.0  17480   892 pts/0    S+   01:18   0:00 grep --color=auto dns
vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl restart dnsmasq
Failed to restart dnsmasq.service: Unit dnsmasq.service not found.

vagrant@vagrant-VirtualBox:~/projects/users$  sudo apt install dnsmasq
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  resolvconf
The following NEW packages will be installed:
  dnsmasq
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 16.2 kB of archives.
After this operation, 73.7 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu cosmic/universe amd64 dnsmasq all 2.79-1 [16.2 kB]
Fetched 16.2 kB in 0s (34.6 kB/s)
Selecting previously unselected package dnsmasq.
(Reading database ... 137753 files and directories currently installed.)
Preparing to unpack .../dnsmasq_2.79-1_all.deb ...
Unpacking dnsmasq (2.79-1) ...
Setting up dnsmasq (2.79-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /lib/systemd/system/dnsmasq.service.
Job for dnsmasq.service failed because the control process exited with error code.
See "systemctl status dnsmasq.service" and "journalctl -xe" for details.
invoke-rc.d: initscript dnsmasq, action "start" failed.
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2018-11-12 01:19:50 CST; 53ms ago
  Process: 12624 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=2)
  Process: 12623 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)

Nov 12 01:19:50 vagrant-VirtualBox systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server...
Nov 12 01:19:50 vagrant-VirtualBox dnsmasq[12623]: dnsmasq: syntax check OK.
Nov 12 01:19:50 vagrant-VirtualBox dnsmasq[12624]: dnsmasq: failed to create listening socket for port 53: Address already in use
Nov 12 01:19:50 vagrant-VirtualBox dnsmasq[12624]: failed to create listening socket for port 53: Address already in use
Nov 12 01:19:50 vagrant-VirtualBox dnsmasq[12624]: FAILED to start up
Nov 12 01:19:50 vagrant-VirtualBox systemd[1]: dnsmasq.service: Control process exited, code=exited status=2
Nov 12 01:19:50 vagrant-VirtualBox systemd[1]: dnsmasq.service: Failed with result 'exit-code'.
Nov 12 01:19:50 vagrant-VirtualBox systemd[1]: Failed to start dnsmasq - A lightweight DHCP and caching DNS server.
Processing triggers for systemd (239-7ubuntu10.1) ...

vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl disable systemd-resolved
Removed /etc/systemd/system/multi-user.target.wants/systemd-resolved.service.
Removed /etc/systemd/system/dbus-org.freedesktop.resolve1.service.
vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl stop systemd-resolved
vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl enable dnsmasq
Synchronizing state of dnsmasq.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable dnsmasq
vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl restart dnsmasq

vagrant@vagrant-VirtualBox:~/projects/users$ ps aux | grep dns
dnsmasq  12912  0.0  0.0  41620   356 ?        S    01:21   0:00 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5 --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d
vagrant  12929  0.0  0.0  17480   892 pts/0    S+   01:22   0:00 grep --color=auto dns

*Forward .test to localhost

vagrant@vagrant-VirtualBox:~/projects/users$ cat /etc/NetworkManager/dnsmasq.d/prax
local=/test/
address=/test/127.0.0.1
address=/test/::1

vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl restart NetworkManager.service

**Set up iptables**
vagrant@vagrant-VirtualBox:~/projects/users$ cat /etc/systemd/system/prax-iptables.service
[Unit]
Description=Prax (iptables configuration)
DefaultDependencies=no
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=oneshot
ExecStart=/usr/bin/prax iptables start
ExecStop=/usr/bin/prax iptables stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl enable prax-iptables.service
Created symlink /etc/systemd/system/multi-user.target.wants/prax-iptables.service → /etc/systemd/system/prax-iptables.service.

vagrant@vagrant-VirtualBox:~/projects/users$ sudo systemctl start prax-iptables.service

vagrant@vagrant-VirtualBox:~/projects/users$ systemctl | grep prax
prax-iptables.service

** Test prax **
vagrant@vagrant-VirtualBox:~/projects/users$ prax link
ln -s '/home/vagrant/projects/users' '/home/vagrant/.prax/users'

vagrant@vagrant-VirtualBox:~/projects/users$ prax start
I, [2018-11-12 01:30:57 -06:00 #13904]  INFO -- prax: binding to [::]:20559

new tab

vagrant@vagrant-VirtualBox:~/projects/users$ prax open
+ xdg-open http://users.test

WORKS!!

** prax at login **
vagrant@vagrant-VirtualBox:~/projects/users$ cat ~/.config/systemd/user/prax.service
[Unit]
Description=Prax

[Service]
Type=simple
ExecStart=/usr/bin/prax start
ExecStop=/usr/bin/prax stop
WorkingDirectory=%h

[Install]
WantedBy=default.target

** restarted **
prax does not work

vagrant@vagrant-VirtualBox:~/projects$ systemctl | grep prax
  prax-iptables.service                                                                    loaded active exited    Prax (iptables configuration)                                     
  prax.service                                                                             loaded active exited    LSB: Prax Rack server (iptables configuration).         

agrant@vagrant-VirtualBox:~/projects/users$ ps aux | grep dns
vagrant   2819  0.0  0.0  17480   884 pts/1    S+   01:44   0:00 grep --color=auto dns

vagrant@vagrant-VirtualBox:~/projects/users$ systemctl status dnsmasq.service
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: 
   Active: failed (Result: exit-code) since Mon 2018-11-12 01:45:24 CST; 16s ago
  Process: 2849 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=
  Process: 2838 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUC

Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: Starting dnsmasq - A lightweight 
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2838]: dnsmasq: syntax check OK.
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: dnsmasq: directory /etc/resolv
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: dnsmasq.service: Control process 
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: directory /etc/resolv.conf for
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: dnsmasq.service: Failed with resu
Nov 12 01:45:24 vagrant-VirtualBox dnsmasq[2849]: FAILED to start up
Nov 12 01:45:24 vagrant-VirtualBox systemd[1]: Failed to start dnsmasq - A light

from prax.cr.

ysbaddaden avatar ysbaddaden commented on May 18, 2024

dnsmasq is just a mean to resolve a TLD wildcard (.localhost and .test) as a local IP. I use it because it's simple and came preinstalled in Ubuntu. This can be achieved in different ways. For example, maybe systemd-resolved can be told to do that?

Actually, systemd-resolved should resolve *.localhost and *.localhost.localdomain as 127.0.0.1 and ::1 by default (see https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html). Maybe you can use http://users.localhost/ instead of http://users.test/. Prax doesn't really care about the TLD, it can be whatever we want. In this case, don't bother with dnsmasq and remove it.

The port redirection service should work, I guess?

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

Spent a whole day :(, nothing I tried works. I loose internet when I reboot and prax is not working. I need to have .test working.

@tijn
Do you have a sample dnsmasq.conf I could try? And what about /etc/resolve.conf, everything I tried regarding does not work? And what about systemd-resolved do you disable it completely have them both?

Thank you very much for you asistance.

from prax.cr.

ysbaddaden avatar ysbaddaden commented on May 18, 2024

You should remove dnsmasq and reenable systemd-resolved. Don't fight against systemd, you'll just lose an awful lot of time and get crazy and have nothing that works.

systemd-resolved is supposed to resolve *.localhost as 127.0.0.1 and ::1 by default which Prax will happily accept. Try to get http://users.localhost/ working first.

Then, if you have .localhost working, you can try using dnsmasq as a frontend (or backend?) for systemd-resolved or something to get .test working, too.

from prax.cr.

tijn avatar tijn commented on May 18, 2024

Yes, you should follow @ysbaddaden 's advice. It is good advice™.

Once you get *.localhost working you can get back to getting .test to work if you like: (BUT ONLY THEN! 😄)


Do you have a sample dnsmasq.conf I could try?

Sure, here it is:

» cat /etc/dnsmasq.d/prax 
local=/test/
address=/test/127.0.0.1
address=/test/::1

And what about /etc/resolve.conf

Depending on your setup you need to change resolve.conf to include a line like this:name_servers=127.0.0.1 (to use dnsmasq) but that won't work for situations where Networkmanager or similar sofware takes over resolv.conf.

And what about systemd-resolved do you disable it completely have them both?

I have them both enabled on Arch, and that seems to work just fine. I can open my app on http://app.test and on http://app.localhost .

from prax.cr.

bbtdev avatar bbtdev commented on May 18, 2024

I am closing this issue for the moment, since I have to work :(, hopefully I will get to try again in a weekend.

from prax.cr.

Related Issues (20)

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.