Giter VIP home page Giter VIP logo

traveling-ruby's Introduction

Traveling Ruby: self-contained, portable Ruby binaries

Traveling Ruby is a project which supplies self-contained, "portable" Ruby binaries: Ruby binaries that can run on any Linux distribution and any macOS machine. It also has Windows support (with some caveats). This allows Ruby app developers to bundle these binaries with their Ruby app, so that they can distribute a single package to end users, without needing end users to first install Ruby or gems.

Introduction in 2 minutes

Motivation

Ruby is one of our favorite programming languages. Most people use it for web development, but Ruby is so much more. I've been using Ruby for years for writing sysadmin automation scripts, developer command line tools and more. Heroku's Toolbelt and Chef have also demonstrated that Ruby is an excellent language for these sorts of things.

However, distributing such Ruby apps to inexperienced end users or non-Ruby-programmer end users is problematic. If users have to install Ruby first, or if they have to use RubyGems, they can easily run into problems. Even if they already have Ruby installed, they can still run into problems, e.g. by having the wrong Ruby version installed. The point is, it's a very real problem that could harm your reputation.

One solution is to build OS-specific installation packages, e.g. DEBs, RPMs, .pkgs, etc. However, this has two disadvantages:

  1. It requires a lot of work. You not only have to build separate packages for each OS, but also each OS version. And in the context of Linux, you have to treat each distribution as another OS, further increasing the number of combinations. Suppose that you want to support ~2 versions of CentOS/RHEL, ~2 versions of Debian, ~3 versions of Ubuntu, ~2 recent macOS releases. You'll have to create 2 + 2 + 3 + 2 = 9 packages.
  2. Because you typically cannot build an OS-specific installation package using anything but that OS, you need heavyweight tooling, e.g. a fleet of VMs. For example, you can only build Ubuntu 18.04 DEBs on Ubuntu 18.04; you cannot build them from your macOS developer laptop.

This is exactly the approach that Chef has chosen. They built Omnibus, an automation system which spawns an army of VMs for building platform-specific packages. It works, but it's heavyweight and a big hassle. You need a big build machine for that if you want to have reasonable build time. And be prepared to make 20 cups of coffee.

But there is another โ€” much simpler โ€” solution.

Way of the Traveling Ruby

The solution that Traveling Ruby advocates, is to distribute your app as a single self-contained tar.gz/zip package that already includes a precompiled Ruby interpreter for a specific platform (that the Traveling Ruby project provides), as well as all gems that your app depends on. This eliminates the need for heavyweight tooling:

  • A tar.gz/zip file can be created on any platform using small and simple tools.
  • You can create packages for any OS, regardless of which OS you are using.

This makes the release process much simpler. Instead of having to create almost 10 packages using a fleet of VMs, you just create 3 packages quickly and easily from your developer laptop. These 3 packages cover all the major platforms that your end users are on:

However, distributing a precompiled Ruby interpreter that works for all end users, is more easily said than done. Read this section to learn why it's difficult.

Traveling Ruby aims to solve the problem of supplying precompiled Ruby 2.4 binaries that work for all end users.

Getting started

Begin with the tutorials:

Once you've finished the tutorials, read the guides for intermediate to advanced topics:

There are also some real-world examples of how people used Traveling Ruby to package their Ruby tools:

Caveats

Native extensions:

  • Traveling Ruby only supports native extensions when creating Linux and OS X packages. Native extensions are currently not supported when creating Windows packages.
  • Traveling Ruby only supports a number of popular native extension gems, and only in some specific versions. You cannot use just any native extension gem.
  • Native extensions are covered in tutorial 3.

Windows support:

  • Traveling Ruby supports creating packages for Windows, but it does not yet support creating packages on Windows. That is, the Traveling Ruby tutorials and the documentation do not work when you are a Ruby developer on Windows. To create Windows packages, you must use macOS or Linux.

    This is because in our documentation we make heavy use of standard Unix tools. Tools which are not available on Windows. In the future we may replace the use of such tools with Ruby tools so that the documentation works on Windows too.

  • Traveling Ruby currently supports Ruby 2.4.10.

  • Native extensions are not yet supported.

Building binaries

The Traveling Ruby project supplies binaries that application developers can use. These binaries are built using the build systems in this repository. As an application developer, you do not have to use the build system. You only have to use the build systems when contributing to Traveling Ruby, when trying to reproduce our binaries, or when you want to customize the binaries.

For the Linux build system, see linux/README.md.

For the macOS build system, see osx/README.md.

Future work

  • Provide a Rails example.
  • Native extensions support for Windows.
  • Document the Windows build system.
  • Support for creating a single executable instead of a directory.
  • Draw inspiration from enclose.io/ruby-packer. See this Hacker News comment for my comparison analysis.

FAQ

Why it is difficult to supply a precompiled Ruby interpreter that works for all end users?

Chances are that you think that you can compile a Ruby binary on a certain OS, and that users using that same OS can use your Ruby binary. Not quite. Not even when they run the same OS version as you do.

Basically, there are two problems that can prevent a binary from working on another system:

  1. Libraries that your binary depends on, may not be available on the user's OS.
    • When compiling Ruby, you might accidentally introduce a dependency on a non-standard library! As a developer you probably have all sorts non-standard libraries installed on your system. While compiling Ruby, the Ruby build system autodetects certain libraries and links to them.
    • Even different versions of the same OS ship with different libraries! You cannot count on a certain library from an older OS version, to be still available on a newer version of the same OS.
  2. On Linux, there are issues with glibc symbols. This is a little more complicated, so read on.

Assuming that your binary doesn't use any libraries besides the C standard library, binaries compiled on a newer Linux system usually do not work on an older Linux system, even if you do not use newer APIs. This is because of glibc symbols. Each function in glibc - or symbol as C/C++ programmers call it - actually has multiple versions. This allows the glibc developers to change the behavior of a function without breaking backwards compatibility with apps that happen to rely on bugs or implementation-specific behavior. During the linking phase, the linker "helpfully" links against the most recent version of the symbol. The thing is, glibc introduces new symbol versions very often, resulting in binaries that will most likely depend on a recent glibc.

There is no way to tell the compiler and linker to use older symbol versions unless you want to manually specify the version for each and every symbol, which is an undoable task.

The only sane way to get around the glibc symbol problem, and to prevent accidental linking to unwanted libraries, is to create a tightly controlled build environment. On Linux, this build environment with come with an old glibc version. This tightly controlled build environment is sometimes called a "holy build box".

The Traveling Ruby project provides such a holy build box.

Why not just statically link the Ruby binary?

First of all: easier said than done. The compiler prefers to link to dynamic libraries. You have to hand-edit lots of Makefiles to make everything properly link statically. You can't just add -static as compiler flag and expect everything to work.

Second: Ruby is incompatible with static linking. On Linux systems, executables which are statically linked to the C library cannot dynamically load shared libraries. Yet Ruby extensions are shared libraries, and a Ruby interpreter that cannot load Ruby extensions is heavily crippled.

So in Traveling Ruby we've taken a different approach. Our Ruby binaries are dynamically linked against the C library, but only uses old symbols to avoid glibc symbol problems. We also ship carefully-compiled versions of dependent shared libraries, like OpenSSL, ncurses, libedit, etc.

Why is it problematic for end users if I don't bundle a Ruby interpreter?

First of all, users just want to run your app as quickly as possible. Requiring them to install Ruby first is not only a distraction, but it can also cause problems. Here are a few examples of such problems:

  • There are various ways to install Ruby, e.g. by compiling from source, by using apt-get and yum, by using RVM/rbenv/chruby, etc. The choices are obvious to us, but users could get confused by the sheer number of choices. Worse: not all choices are good. APT and YUM often provide old versions of Ruby, which may not be the one that you want. Compiling from source and using rbenv/chruby requires the user to have a compiler toolchain and appropriate libraries pre-installed. How should they know what to pre-install before they can install Ruby? The Internet is filled with a ton of old and outdated tutorials, further increasing their confusion.
  • Users could install Ruby incorrectly, e.g. to a location that isn't in PATH. They could then struggle with "command not found" errors. PATH is obvious to us, but there are a lot of users out there can barely use the command line. We shouldn't punish them for lack of knowledge, they are end users after all.

One way to solve this is for you to "hold the user's hand", by going through the trouble of supplying 4 or 5 different platform-specific installation instructions for installing Ruby. These instructions must be continuously kept up-to-date. That's a lot of work and QA on your part, and I'm sure you just want to concentrate on building your app.

And let's for the sake of argument suppose that the user somehow has Ruby correctly installed. They still need to install your app. The most obvious way to do that is through RubyGems. But that will open a whole new can of worms:

  • On some OSes, RubyGems is configured in such a way that the RubyGems-installed commands are not in PATH. For a classic example, try running this on Debian 6:

     $ sudo apt-get install rubygems
     $ sudo gem install rails
     $ rails new foo
     bash: rails: command not found
    

    Not a good first impression for end users.

  • Depending on how Ruby is installed, you may or may not have to run gem install with sudo. It depends on whether GEM_HOME is writable by the current user or not. You can't tell them "always run with sudo", because if their GEM_HOME is in their home directory, running gem install with sudo will mess up all sorts of permissions.

  • Did I just mention sudo? No, because sudo by default resets a lot of environment variables. Environment variables which may be important for Ruby to work.

    • If the user installed Ruby with RVM, then the user has to run rvmsudo instead of sudo. RVM is implemented by setting PATH, RUBYLIB, GEM_HOME and other environment variables. rvmsudo is a wrapper around sudo which preserves these environment variables.
    • If the user installed Ruby with rbenv or chruby... pray that they know what they're doing. Rbenv and chruby also require correct PATH, RUBYLIB, GEM_HOME etc to be set to specific values, but they provide no rvmsudo-like tool for preserving them after taking sudo access. So if you want to be user-friendly, you have to write documentation that tells users to sudo to a bash shell first, fix their PATH, RUBYLIB etc, and then run gem install.

The point is, there's a lot of opportunity for end users to get stuck, confused and frustrated. You can deal with all these problems by supplying excellent documentation that handles all of these cases (and probably more, because there are infinite ways to break things). That's exactly what we've done for Phusion Passenger. Our RubyGems installation instructions spell out exactly how to install Ruby for each of the major operating systems, how to find out whether they need to run gem install with sudo, how to find out whether they need to run rvmsudo instead of sudo. It has been a lot of work, and even then we still haven't covered all the cases. We're still lacking documentation on what rbenv and chruby users should do. Right now, rbenv/chruby users regularly contact our community discussion forum about installation problems related to sudo access and environment variables.

Or you can just use Traveling Ruby and be done with it. We can't do it for Phusion Passenger because by its very nature it has to work with an already-installed Ruby, but maybe you can for writing your next command line tool.

The problems sound hypothetical. Is it really that big of a deal for end users?

Yes. These problems can put off your users from installing your app at all and can give you a bad reputation. Especially Chef has suffered a lot from this. A lot of people have had bad experience in the past with installing Chef through RubyGems. Chef has solved this problem for years by supplying platform-specific packages for years (DEBs, RPMs, etc), but the reputation stuck: there are still people out there who shun Chef because they think they have to install Ruby and use RubyGems.

I target macOS, which already ships Ruby. Should I still bundle a Ruby interpreter?

Yes. Different macOS versions ship different Ruby versions. There can be significant compatibility differences between even minor Ruby versions. One of the biggest issues is the keyword argument changes introduced in Ruby 2.7 and later. Only by bundling Ruby can you be sure that OS upgrades won't break your app.

Does Traveling Ruby support Windows?

Yes, but with some caveats.

How big is a hello world packaged with Traveling Ruby?

It's about 6 MB compressed.

traveling-ruby's People

Contributors

ahoward avatar antulik avatar brandondrew avatar dependabot[bot] avatar dsh0416 avatar etdsoft avatar floord avatar foobarwidget avatar grosser avatar kampka avatar krausefx avatar michaelkirk avatar mikecanann avatar nathanbwright avatar petems avatar sboesen 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

traveling-ruby's Issues

tutorial 2 rake package fails

$ rake package           
rm -rf packaging/tmp
mkdir packaging/tmp
cp Gemfile Gemfile.lock packaging/tmp/
cd packaging/tmp && env BUNDLE_IGNORE_CONFIG=1 bundle install --path ../vendor --without development
Fetching gem metadata from https://rubygems.org/..
Installing paint 0.9.0
Using bundler 1.7.6
Your bundle is complete!
Gems in the group development were not installed.
It was installed into /Users/drnic/Projects/travelling-ruby/hello_app/packaging/vendor
rm -rf packaging/tmp
rm -f packaging/vendor/*/*/cache/*
cd packaging && curl -L -O --fail http://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-20141206-2.1.5-linux-x86.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (22) The requested URL returned error: 404 Not Found

Seems to be an issue if there is a space anywhere in the file path of the directory

so running ./hello-1.0.0-osx/hello works

but changing the directory with

mv hello-1.0.0-osx hello\ 1.0.0-osx

and running

./hello\ 1.0.0-osx/hello

causes

/Users/danmanstx/Desktop/ruby/traveling-ruby-hello-demo/hello 1.0.0-osx/lib/ruby/bin/ruby: line 14: 1.0.0-osx/lib/ruby/lib/ruby/gems/2.1.0: No such file or directory

I am really running into this when using a packaged ruby inside of something that resides in Application Support on Mac OS X. Above is just a simplified example.

Windows tar.gz for 2.2.2

rubyinstaller.org has released 2.2.2 (and 2.2.3). Any chance we could get a traveling-ruby-20150715-2.2.2-win32-x86.tar.gz package uploaded to the Amazon bucket?

Is there anyway I can help?

Warning displayed when requiring readline

When requiring readline in the packaged app, the following warning is displayed when running it after packaging:

No entry for terminal type "xterm-256color";
using dumb terminal settings.

To reproduce change the hello.rb file in tutorial 2 as follows:

#!/usr/bin/env ruby
require 'faker'
require 'readline'
puts "hello #{Faker::Name.name}"

A workaround is to specify -rreadline when invoking ruby in the wrapper script:

# Run the actual app using the bundled Ruby interpreter, with Bundler activated.
exec "$SELFDIR/lib/ruby/bin/ruby" -rbundler/setup -rreadline "$SELFDIR/lib/app/hello.rb"

[osx] error building make: CMAKE_OSX_DEPLOYMENT_TARGET is '10.8' but CMAKE_OSX_SYSROOT ""

I'm trying to build the ruby/gems so I can generate a new native gem build. But on my 10.10 machine I get the following error:

$ cd osx
$ make package
...
Installing CMake...
------------------------------------------
+ rm -f cmake-3.0.2.tar.gz
+ curl --fail -L -o cmake-3.0.2.tar.gz http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5361k  100 5361k    0     0   146k      0  0:00:36  0:00:36 --:--:--  135k
+ tar xzf cmake-3.0.2.tar.gz
+ rm cmake-3.0.2.tar.gz
Entering /Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/runtime/cmake-3.0.2
+ ./configure --prefix=/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/runtime --no-qt-gui --parallel=4
---------------------------------------------
CMake 3.0.2, Copyright 2000-2014 Kitware, Inc.
C compiler on this system is: /Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/cc 
C++ compiler on this system is: /Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ 
Makefile processor on this system is: make
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ is GNU compiler
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has setenv
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has unsetenv
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ does not have environ in stdlib.h
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has STL in std:: namespace
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has ANSI streams
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has streams in std:: namespace
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has sstream
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has operator!=(string, char*)
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has stl iterator_traits
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has standard template allocator
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has allocator<>::rebind<>
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ does not have non-standard allocator<>::max_size argument
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has stl containers supporting allocator objects
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has stl wstring
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has header cstddef
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ requires template friends to use <>
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ supports member templates
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has standard template specialization syntax
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has argument dependent lookup
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ does not have struct stat with st_mtim member
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has ios::binary openmode
/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/internal/bin/c++ has ANSI for scoping
---------------------------------------------
make[1]: `cmake' is up to date.
loading initial cache file /Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/runtime/cmake-3.0.2/Bootstrap.cmk/InitialCacheFlags.cmake
-- The C compiler identification is AppleClang 6.0.0.6000056
-- The CXX compiler identification is AppleClang 6.0.0.6000056
CMake Error at Modules/Platform/Darwin.cmake:211 (message):
  CMAKE_OSX_DEPLOYMENT_TARGET is '10.8' but CMAKE_OSX_SYSROOT:

   ""

  is not set to a MacOSX SDK with a recognized version.  Either set
  CMAKE_OSX_SYSROOT to a valid SDK or set CMAKE_OSX_DEPLOYMENT_TARGET to
  empty.
Call Stack (most recent call first):
  Modules/CMakeSystemSpecificInformation.cmake:36 (include)
  CMakeLists.txt:16 (project)


-- Configuring incomplete, errors occurred!
See also "/Users/drnic/Projects/travelling-ruby/traveling-ruby/osx/runtime/cmake-3.0.2/CMakeFiles/CMakeOutput.log".
---------------------------------------------
Error when bootstrapping CMake:
Problem while running initial CMake
---------------------------------------------
make: *** [runtime/ok] Error 11

Is there something I'm supposed to setup first?

Package ffi

OS X already done. Still needs to package Linux version.

ARM-Support

Is it possible to include support for arm processors?

Linux is packaged with different SSL certificate

I was recently running into some ssl errors using traveling ruby. Using this script helped diagnosis the problem,

/opt/traveling-ruby/bin/ruby (2.1.5-p273)
OpenSSL 1.0.1j 15 Oct 2014: /usr/local/override/openssl
SSL_CERT_DIR=""
SSL_CERT_FILE="/opt/traveling-ruby/lib/cert.pem"

HEAD https://[HOST]:443
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

The server presented a certificate that could not be verified:
  subject: /C=US/O=Entrust, Inc./OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2006 Entrust, Inc./CN=Entrust Root Certification Authority
  issuer: /C=US/O=Entrust, Inc./OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2006 Entrust, Inc./CN=Entrust Root Certification Authority
  error code 19: self signed certificate in certificate chain

I don't see these errors using my local ruby. Trying traveling ruby for mac also does not give me this error. I think I tracked it down to the cert.pem file that is packaged in linux lib/cert.pem is not the same as the one list here. Although they have different names/extensions replacing the cert.pem file with the ca-bundle.crt fixes the issue for me.

I believe I was originally using the first version of traveling ruby but tried the latest as well and had the same problem.

Another approach to Windows packaging

(Not an issue/feature request, just a suggestion, sorry if it is wrong place to communicate it.)

On Windows, typical user is afraid of .bat files, and they are looking ugly (unfriendly black icon, mandatory "flashing" console when running from GUI).

When, several years ago, I've need to "seemlessly" run Ruby programs on Windows, I've invented the trick: customly compiled ruby.exe, which, on running, checks its filename, and finds app/*.rb with the same name and runs it. So, typical package looks like:

+-myapp.exe  <== it is just renamed ruby.exe, provided by Traveling Ruby
+-app/
  |
  +-myapp.rb

This way the package will look like "normal" Windows program.

PS: if this approach will be accepted, it is important to remember Ruby has two executables on Windows: ruby.exe and rubyw.exe -- the latter doesn't require console STDOUT, which is handy for GUI programs or background-running ones.

segfault caused on VIA Nano processor U2250

We've recently distributed VirtKick binaries to our users. One user got segfaults all the time. Not sure if it's directly in Ruby, or some native extension like sqlite (we use sqlite in this application). That's the systemd journal with the backtrace.

CentOS 7 x86_64

[root@hostname ~]# uname -a
Linux hostname 3.10.0-123.13.2.el7.x86_64 #1 SMP Thu Dec 18 14:09:13 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

VIA Nano processor U2250 lacking some flags that your code requires to run?

[root@hostname ~]# cat /proc/cpuinfo
processor : 0
vendor_id : CentaurHauls
cpu family : 6 
model : 15 
model name : VIA Nano processor U2250 (1.6GHz Capable) 
stepping : 3 cpu 
MHz : 800.000 
cache size : 1024 KB 
physical id : 0 
siblings : 1 '
core id : 0 
cpu cores : 1 
apicid : 0 
initial apicid : 0 
fpu : yes 
fpu_exception : yes 
cpuid level : 10 
wp : yes 
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush acpi mmx fxsr sse sse2 ss tm pbe syscall nx lm constant_tsc rep_good nopl pni monitor vmx est tm2 ssse3 cx16 xtpr rng rng_en ace ace_en ace2 phe phe_en lahf_lm 
bogomips : 3192.14 
clflush size : 64 
cache_alignment : 128 
address sizes : 36 bits physical, 48 bits virtual 
power management:

Thanks.

[linux] make package failed

Running make package from my OS X machine, with boot2docker running and the docker image built:

$ make package     
grep: /proc/cpuinfo: No such file or directory
mkdir -p runtime/x86
./setup-runtime -a x86 runtime/x86
Preparing
------------------------------------------
+ mkdir -p /Users/drnic/Projects/travelling-ruby/traveling-ruby/linux/runtime/x86/mock
+ chown root:mock /var/lib/mock
+ chmod g+ws /var/lib/mock

Setting up chroot
------------------------------------------
+ /system/setuser app /usr/bin/mock -r epel-5-i386 --init
INFO: mock.py version 1.1.41 starting...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
Start: run
Start: lock buildroot
Start: clean chroot
Finish: clean chroot
Finish: lock buildroot
Start: chroot init
Start: lock buildroot
Mock Version: 1.1.41
INFO: Mock Version: 1.1.41
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled yum cache
Start: cleaning yum metadata
Finish: cleaning yum metadata
INFO: enabled ccache
Start: device setup
Finish: device setup
ERROR: [Errno 1] Operation not permitted
ERROR: The most common cause for this error is trying to run /usr/sbin/mock as an unprivileged user.
ERROR: Check your path to make sure that /usr/bin/ is listed before /usr/sbin, or manually run /usr/bin/mock to see if that fixes this problem.



+ /system/setuser app /usr/bin/mock -r epel-5-i386 --install yum
INFO: mock.py version 1.1.41 starting...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
Start: run
Mock Version: 1.1.41
INFO: Mock Version: 1.1.41
Start: lock buildroot
INFO: installing package(s): yum
ERROR: Command failed: 
 # ['/usr/bin/yum', '--installroot', '/var/lib/mock/epel-5-i386/root/', '--releasever', '5', 'install', 'yum']
rpmdb: mmap: Invalid argument
error: db3 error(22) from dbenv->open: Invalid argument
error: cannot open Packages index using db3 - Invalid argument (22)
error: cannot open Packages database in /var/lib/mock/epel-5-i386/root/var/lib/rpm
CRITICAL:yum.main:

Error: rpmdb open failed

make: *** [runtime/x86/ok] Error 30

can not find libffi.so.6 on OpenSUSE

missing library when running on OpenSUSE: libffi.so.6 - found in lib/ruby/2.1.0/x86_64-linux/fiddle.so

this happens as there are at least 2 naming conventions:

  1. Debian names the library libffi.so.6 - even the libffi is in version 3.x
  2. OpenSUSE names the library libffi.so.4 - as it is based on sources of libffi from GNU GCC 4.x
  3. I have seen other systems in google search that refer to it as libffi.so.5 (older Ubuntu?)
  4. It is possible that it will be named libffi.so.3 - as it's the real version provided by https://github.com/atgreen/libffi

in all of this cases this name should be link to libffi.so:

  • can the .6 be dropped
  • or the library included?

Idea: Build system should be written in Go

This would enable the build system to be bundled as a binary that would work across windows/linux/osx.

I'd be willing to give this a go if someone thought it was a good idea.

Guide should describe how to set up a ruby gem

I maintain 5 ruby gems, which could be delivered using Traveling Ruby for easier install.
Right now, it's quite a pain to adapt the Rakefile to make it work with a ruby gem:

I changed the following:

sh "cp Gemfile Gemfile.lock packaging/tmp/"

to

sh "cp Gemfile Gemfile.lock #{PACKAGE_NAME}.gemspec packaging/tmp/"

and

sh "cp hello.rb #{package_dir}/lib/app/"

to

sh "cp -R lib/* #{package_dir}/lib/app/"

Unfortunately I haven't yet got it to work, since I've got problems with the path:

[path]/[name]-0.1.0-osx/lib/app/[name].rb:2:in `require': cannot load such file -- [name]/version (LoadError)
    from [path]/[name]-0.1.0-osx/lib/app/[name].rb:2:in `<main>'

I'm pretty sure some things will change from time to time in the proposed Rakefile described in the guide. How should I keep up to date with the changes?

  • I don't get to know when something changes, except when I actively watch the repository
  • I have to re-apply my manual patches, change the name, version, remove the linux related code, etc.
  • I think there are quite a lot of ruby gems, which can now be offered as one package, like the nomad tools and my open source tools.

Maybe I'm missing something here?

Traveling Ruby looks really promising, but is very hard to set up and maintain for me right now.

Adding RedCloth

Hi there,

Just trying to contribute a packaged version of RedCloth (following up from here). Running OSX.

This is what I did:

  1. Clone the repo
  2. Added gem 'RedCloth' to ./shared/Gemfile
  3. Updated the reference to XZ library XZ_VERSION=5.0.8 in ./osx/setup-runtime
  4. Ran
$ cd osx/
$ make

I see the:

Postprocessing build output...
------------------------------------------
....
Fetching gem metadata from https://rubygems.org/........
Resolving dependencies...
Installing RedCloth 4.2.9
Installing bcrypt 3.1.9

Which seems to run fine. And the process ends with

Packaging Ruby...
------------------------------------------
+ tar -cf traveling-ruby-20141224-2.1.5-osx.tar.gz.tmp -C output --exclude include/* --exclude lib/ruby/gems/2.1.0/extensions/* --exclude lib/ruby/gems/2.1.0/gems/* --exclude lib/ruby/gems/2.1.0/specifications/* .
+ tar -rf traveling-ruby-20141224-2.1.5-osx.tar.gz.tmp -C output ./lib/ruby/gems/2.1.0/gems/bundler-1.7.3 ./lib/ruby/gems/2.1.0/specifications/bundler-1.7.3.gemspec ./lib/ruby/gems/2.1.0/specifications/default
+ gzip --best --no-name -c traveling-ruby-20141224-2.1.5-osx.tar.gz.tmp > traveling-ruby-20141224-2.1.5-osx.tar.gz
+ rm traveling-ruby-20141224-2.1.5-osx.tar.gz.tmp
./package -E traveling-ruby-gems-20141224-2.1.5-osx output

Packaging gem native extensions...
------------------------------------------
There are no gems with native extensions.

Does this mean it worked? What's next?

RUBYLIB environment variable is not take effect.

#!/usr/bin/env bash

set -e

export RUBYLIB=.:$RUBYLIB

SELFDIR=${0%/*}

export BUNDLE_GEMFILE="$SELFDIR/lib/vendor/Gemfile"
unset BUNDLE_IGNORE_CONFIG

$SELFDIR/lib/ruby/bin/ruby -e 'puts $LOAD_PATH'
$: ./blog
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/site_ruby/2.2.0
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/site_ruby/2.2.0/x86_64-linux
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/site_ruby
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/vendor_ruby/2.2.0
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/vendor_ruby/2.2.0/x86_64-linux
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/vendor_ruby
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/2.2.0
/home/zw963/121/blog/.packages/blog-linux-x86_64/lib/ruby/lib/ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/site_ruby/2.2.0
/tmp/ruby/lib/ruby/site_ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/site_ruby
/tmp/ruby/lib/ruby/vendor_ruby/2.2.0
/tmp/ruby/lib/ruby/vendor_ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/vendor_ruby
/tmp/ruby/lib/ruby/2.2.0
/tmp/ruby/lib/ruby/2.2.0/x86_64-linux

ruby $LOAD_PATH is not take effect by exported RUBYLIB shell environment variable.

Curses native extension?

I'm having troubles packaging a CLI app built using Thor. I am using Curses to adapt to the user's terminal width. When I create the package in the system I want to use, it works fine. However, when I create a Linux package in OSX and then I try to run it on Linux, it doesn't find curses dynamic library.

.../lib/vendor/ruby/2.1.0/gems/curses-1.0.1/lib/curses.rb:1:in `require': cannot load such file -- curses.so (LoadError)

I didn't see any reference to Curses in the tutorials or in the Traveling Ruby Amazon S3 bucket. As from version 2.1.0 of Ruby curses is not part of the standard library, do I need to treat is as a native extension when creating the package with traveling ruby?

'charlock_holmes' gem doesn't work on Linux

> require 'charlock_holmes'
LoadError: output/x86/lib/ruby/gems/2.1.0/extensions/x86-linux/2.1.0-static/charlock_holmes-0.7.3/charlock_holmes/charlock_holmes.so:
undefined symbol: _ZTIN6icu_5411SymbolTableE - output/x86/lib/ruby/gems/2.1.0/extensions/x86-linux/2.1.0-static/charlock_holmes-0.7.3/charlock_holmes/charlock_holmes.so

Tutorial 1 archive won't open.

I followed the instructions for tutorial 1, when I open the archive I get the following error:
Unable to finish expanding "hello-1.0.0-osx.tar.gz"
into "hello_app"
Could not move "hello-1.0.0-osx" into destination

ruby 2.2.0

Any ETA on ruby 2.2.0 binary?

Thanks!

Which native extensions should we package?

In issue #3 I have described how I envision support for native extensions to work. Since requiring developers to build native extensions themselves is too much hassle, I proposed providing precompiled versions of the most popular native extensions, that developers can just easily drop into their package.

But this raises the question: which native extensions? We can't automatically package them all. For reasons explained in #3, packaging native extensions requires a lot of manual work. So we have to choose.

I plan on packaging these gems:

Because they're popular:

  • nokogori
  • json

Because Rails apps likely need these:

  • sqlite3
  • mysql2
  • pg
  • bcrypt

I've opened a poll for more native extensions. Please add your input here: https://docs.google.com/spreadsheets/d/1oNgrwHyV9UaMGFTttsfA9QPvL461NWLfHeeAap3Az_A/edit?usp=sharing

Any chance of a 32-bit OS X build?

I'm usually the first person to complain about proprietary linux software only being released in 32-bit versions. In this case, though, I have to deal with a handful of Macs that are stuck at 10.6.8 and running a 32-bit kernel. Apparently 10.6.8 is like Windows XP -- there's a number of holdouts who didn't like the direction Apple went with subsequent versions.

I'll see if getting these guys to boot into the 64-bit kernel is an option. If building a 32-bit OS x version is a simple procedure, though, I'd greatly appreciate it.

How would support for native extensions work?

In README you've said:

You cannot yet use gems with native extensions. We are still working on a mechanism to make this possible.

Could you share what is the underlying idea of this mechanism? I'm really curious.

Maybe need a file to save traveling-ruby version.

When I use linux-x86_64 machine development one ruby application which need
run in osx, there is no enough infomation to let me know which traveling ruby version
is packaged, so, if run bundle which belong to another ruby version, maybe result in
error result.

Duplicated libraries

Hello,

I just found some dylibs are copied instead linked, like 1.8MB each: libcrypto.dylib, libcrypto.1.0.0.dylib

Is that on purpose? It makes result bundle much more heavy.

All dylib duplicates:

./lib/libyaml-0.2.dylib
./lib/libyaml.dylib

./lib/libffi.6.dylib
./lib/libffi.dylib

./lib/liblzma.5.dylib
./lib/liblzma.dylib

./lib/libedit.0.dylib
./lib/libedit.dylib
./lib/libreadline.dylib

./lib/libncurses.5.dylib
./lib/libncurses.dylib
./lib/libtermcap.dylib

./lib/libgmp.10.dylib
./lib/libgmp.dylib

./lib/libssl.1.0.0.dylib
./lib/libssl.dylib

./lib/libcrypto.1.0.0.dylib
./lib/libcrypto.dylib

./lib/libsqlite3.0.dylib
./lib/libsqlite3.dylib

default $LOAD_PATH is include /tmp/ruby/ ?

following is a test for traveling-ruby package.

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

puts "Ruby Version: #{RUBY_VERSION} #{RUBY_PLATFORM}"
puts "LOAD_PATH:"
puts $:
~/121/hello-1.0.0/linux-x86_64/hello
Ruby Version: 2.2.2
Ruby PLATFORM: x86_64-linux
LOAD_PATH:
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/site_ruby/2.2.0
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/site_ruby/2.2.0/x86_64-linux
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/site_ruby
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/vendor_ruby/2.2.0
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/vendor_ruby/2.2.0/x86_64-linux
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/vendor_ruby
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/2.2.0
/home/zw963/121/hello-1.0.0/linux-x86_64/lib/ruby/lib/ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/site_ruby/2.2.0
/tmp/ruby/lib/ruby/site_ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/site_ruby
/tmp/ruby/lib/ruby/vendor_ruby/2.2.0
/tmp/ruby/lib/ruby/vendor_ruby/2.2.0/x86_64-linux
/tmp/ruby/lib/ruby/vendor_ruby
/tmp/ruby/lib/ruby/2.2.0
/tmp/ruby/lib/ruby/2.2.0/x86_64-linux

I have unset all my ruby environment variable, RUBYOPT, RUBYLIB.
still see /tmp/ruby/lib..., this is so strange ...

Security vulnerability in Ruby 2.2.2 and Nokogiri <1.6.6.4. Bump and rebuild needed.

There's a security vulnerability in the latest Traveling Ruby. http://traveling-ruby.s3-us-west-2.amazonaws.com/list.html doesn't list any version with Ruby 2.2.3 and Nokogiri 1.6.6.4.

MULTIPLE VULNERABILITIES IN LIBXML2, LIBXSLT

The vendored libxml2 and libxslt libraries have multiple vulnerabilities: CVE-2015-1819 CVE-2015-7941_1 CVE-2015-7941_2 CVE-2015-7942 CVE-2015-7942-2 CVE-2015-8035 CVE-2015-7995

Affected versions: All versions prior to 1.6.6.3
Fixed versions: 1.6.6.3, 1.6.7.rc4
Solution: Upgrade to latest version.
Sources: https://groups.google.com/forum/#!topic/nokogiri-talk/gEpHWo2xLCE
https://github.com/sparklemotion/nokogiri/blob/v1.6.6.x/CHANGELOG.rdoc#1663--2015-11-16
sparklemotion/nokogiri@ac6106f
https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.rdoc#167rc4--2015-11-22
sparklemotion/nokogiri@ee52b7b

UNSAFE PARSING OF UNCLOSED COMMENTS

Parsing an unclosed comment can result in Conditional jump or move depends on uninitialised value(s) and unsafe memory access.

Affected versions: All versions prior to 1.6.6.4
Fixed versions: 1.6.6.4, 1.6.7.rc4
Solution: Upgrade to latest version.
Credit: Florian Weingarten, Francois Chagnon
Sources: https://groups.google.com/forum/#!topic/nokogiri-talk/nFl0mfcJpbk
https://github.com/sparklemotion/nokogiri/blob/v1.6.6.x/CHANGELOG.rdoc#1664--2015-11-19
sparklemotion/nokogiri@3ab1b23
https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.rdoc#167rc4--2015-11-22
sparklemotion/nokogiri@0948e9f

Ruby 2.2.3 Released

We are pleased to announce the release of Ruby 2.2.3. This is a TEENY version release of the stable 2.2 series.

This release includes the security fix for a RubyGems domain name verification vulnerability.

There are also some bugfixes. See ChangeLog for details.

windows version supported?

What version does travelling ruby support for Windows?

This says 2.1.5:

Traveling Ruby currently supports Ruby 2.1.5 and Ruby 2.2.0 for Linux and OS X. But for Windows, only Ruby 2.1.5 is supported. This is because the RubyInstaller project hasn't released Ruby 2.2.0 binaries yet.

But RubyInstaller has 2.2.1 here:
http://rubyinstaller.org/news/2015/03/06/rubyinstaller-2-2-1-released/

And the S3 bucket lists 2.2.2?
https://traveling-ruby.s3-us-west-2.amazonaws.com/list.html

Is the readme just outdated?

Motivation for BUNDLE_IGNORE_CONFIG=1 in guides?

I'm a bit curious why BUNDLE_IGNORE_CONFIG=1 is used in the guides? I'm assuming that it can cause some kind of issue?

I've been developing a lil' library / CLI that uses Traveling Ruby and we had some issues when trying to package on of our internal applications at work that used gems from our private RubyGems server (and we have the credentials configured in the global Bundler config to avoid having them in the Gemfile). We solved it by simply removing the environment variable and everything packaged just fine.

Traveling Ruby is really great and makes it sooo much easier to create isolated archives of Ruby applications, fantastic work!

Status of Windows support

Hi,

I'm noticing that support for Windows is there with some caveats, but all the examples don't seem to reference Windows.. Is more planned on Windows support for the future?

[linux] docker image not available

$ make package
grep: /proc/cpuinfo: No such file or directory
mkdir -p runtime/x86
./setup-runtime -a x86 runtime/x86
Preparing
------------------------------------------
+ mkdir -p /Users/drnic/Projects/travelling-ruby/traveling-ruby/linux/runtime/x86/mock
Unable to find image 'phusion/ruby-traveler-builder:latest' locally
Pulling repository phusion/ruby-traveler-builder
FATA[0002] Error: image phusion/ruby-traveler-builder:latest not found 
make: *** [runtime/x86/ok] Error 1

Package mysql2

OS X already done. Still need to package Linux version.

'rugged' gem doesn't work on Linux

On x86 I get this:

> require 'rugged'
irb: symbol lookup error: output/x86/lib/ruby/gems/2.1.0/extensions/x86-linux/2.1.0-static/rugged-0.22.0b5/rugged/rugged.so:
undefined symbol: __sync_add_and_fetch_4

We can probably fix this by passing -march=i586 to the compiler. That fixes gcc builtin atomics. The default architecture on x86 CentOS 5 i386.

But on x86_64 I get this:

> require 'rugged'
irb: symbol lookup error: output/x86_64/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0-static/rugged-0.22.0b5/rugged/rugged.so:
undefined symbol: ERR_load_crypto_strings

There was an error in your Gemfile, and Bundler cannot continue.

I just tried to adopt traveling ruby for my existing project. I had to do some hacking to make it also include my .gemspec (which contains all the dependencies), a bin folder, change the wrapper script, etc.

But now I'm getting the error:

There was an error in your Gemfile, and Bundler cannot continue.

without any other reference.
My Gemfile, Gemfile.lock and name.gemspec are located in lib/vendor.

WHile trying to debug what the issue is I commented out the Gemfile and added a simple puts into it but nothing changed, even after deleting the .lock.

Can you maybe help me with this? Because I'm getting NO feedback whatsoever what the issue with my Gemfile is :( Thanks

Ideas for wrapper script that loads gems without bundler?

I'm having an issue where the bin I'm running isn't expecting to be run under bundler and it doesn't clean the env before it spawns more processes.

Thoughts on how to write a wrapper script that invokes a bin without -rbundler/setup?

Running rails

I have followed the tutorials and I think I package my app correctly with nokogiri, sqlite3 and bcrypt native addons.

I try to run rails with:

#!/bin/bash
set -e
SELFDIR="`dirname \"$0\"`"
SELFDIR="`cd \"$SELFDIR\" && pwd`"
export BUNDLE_GEMFILE="$SELFDIR/lib/vendor/Gemfile"
unset BUNDLE_IGNORE_CONFIG
cd "$SELFDIR/lib/app"
exec "$SELFDIR/lib/ruby/bin/ruby" -rbundler/setup "$SELFDIR/lib/vendor/ruby/2.1.0/bin/rails" s -p 8000

Unfortunately I get:

/code/virtkick/webapp/virtkick-webapp-1.0.0-linux-x86_64/lib/ruby/lib/ruby/2.1.0/rubygems/ext/builder.rb:89:in `run': ERROR: Failed to build gem native extension. (Gem::Ext::BuildError)

    /code/virtkick/webapp/virtkick-webapp-1.0.0-linux-x86_64/lib/ruby/bin/ruby extconf.rb 
checking for main() in -lpthread... /code/virtkick/webapp/virtkick-webapp-1.0.0-linux-x86_64/lib/ruby/lib/ruby/2.1.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.

What other environment should I set for it to see the proper environment?

OS X: link libncurses statically

It looks like only the curses gem requires ncurses. We can link libncurses statically.

I've tried it on Linux, but couldn't get it to work. Ruby crashes upon calling libedit's using_history(), for unknown reasons.

Thin cannot start multiple processes

When attempting to start multiple process of thin in a linux-x86 environment, it fails to start instead outputting:

/opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- rubyeventmachine (LoadError)

I created a simple app (https://github.com/kareem-abdelsalam/thin-multiserver-test).
To run it:

  • Create the app by running:
bundle install
rake package:linux:x86 DIR_ONLY=1
  • Start the VM
vagrant up tr_installation
vagrant ssh tr_installation
  • Navigate to where the project is
cd /vagrant/thin-multiserver-test-0.2-linux-x86/
  • Run thin in single process mode
./successeding_app start

It operates normally and you can visit the page at (http://192.168.33.12:5000)

  • Run thin in the multi process mode
./failing_app start

It will fail to start printing the message mentioned earlier.

make failed on os x 10.10.1

I've cloned this repo and "cd osx" and "make" and this is the result:

...
Compiling runtime libraries 7/8: sqlite3...
------------------------------------------
Already installed.

Compiling runtime libraries 8/8: liblzma...
------------------------------------------
+ rm -f xz-5.0.7.tar.bz2
+ curl --fail -L -o xz-5.0.7.tar.bz2 http://fossies.org/linux/misc/xz-5.0.7.tar.bz2
dyld: Symbol not found: _sqlite3_intarray_bind
  Referenced from: /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData
  Expected in: /Users/matthias/Sites/traveling-ruby/osx/runtime/lib/libsqlite3.dylib
 in /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData
/Users/matthias/Sites/traveling-ruby/osx/../shared/library.sh: line 26:  3564 Trace/BPT trap: 5       "$@"
make: *** [runtime/ok] Error 133

Any ideas?

Thanx, Matt

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.