Giter Club home page Giter Club logo

image_optim_pack's Introduction

Gem Version Build Status Rubocop Docker build Livecheck Code Climate Depfu Inch CI

image_optim_pack

Precompiled binaries for image_optim.

Contains binaries for Mac OS X (>= 10.9, x86_64) and Linux (x86_64).

A test application with latest image_optim and image_optim_pack is available on render: https://iopack.onrender.com/.

Binaries and libraries

NOTE: On FreeBSD and OpenBSD make is not the GNU Make, so gmake should be used instead.

You can download all source code using gnu make download target:

make download

Installation

gem install image_optim image_optim_pack

Or add to your Gemfile:

gem 'image_optim'
gem 'image_optim_pack'

Development

Mac OS X binaries and libraries are built on host, others using vagrant.

Boxes for vagrant are built using veewee, check boxes/Rakefile and boxes/definitions.

script/run # Build and test all for all oses and architectures
script/run NO_HALT=1 # Don't halt VMs after building
script/run NO_UP=1 # Don't start VMs before building (will fail if not already running)
script/run darwin 64 # Build only platforms matching darwin or 64

make # Build all tools and copy them to vendor/OS-ARCH for current OS and ARCH, then test
make all # same

script/livecheck # Check versions
make update-versions # Update versions in Makefile

make download # Download archives
make download-tidy-up # Remove old archives
make build # Build all without copying to output directory

make test # Test bins for current os/arch
make test -i # Continue if one of bins fail

make clean # Remove build and output directories for current os/arch
make clean-all # Remove build root and output root directories
make clobber # `clean-all` and remove download directory

Docker

This project includes a Dockerfile in the root, which builds a minimal image with most binaries included.

Running

docker run --rm ghcr.io/toy/image_optim --version # image_optim version
docker run --rm ghcr.io/toy/image_optim --info # image_optim info including bin versions
docker run --rm -v "$PWD":/here -w /here ghcr.io/toy/image_optim image-in-this-folder.jpg

Building

make docker-build # will be tagged with latest and current date in format %Y%m%d
make docker-push # will push tags created by docker-build

Copyright

Copyright (c) 2014-2024 Ivan Kuchin. See LICENSE.txt for details.

image_optim_pack's People

Contributors

toy 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

image_optim_pack's Issues

Optimized version guetzli with CUDA & OpenCL

Introduction

Guetzli is a JPEG encoder that aims for excellent compression density at high visual quality. Guetzli-generated images are typically 20-30% smaller than images of equivalent quality generated by libjpeg. Guetzli generates only sequential (nonprogressive) JPEGs due to faster decompression speeds they offer.

About this Repo

Guetzli is an awesome jpeg encoder, however, it works a little bit slow. In order to speed it up, we have added CUDA & OpenCL support for Guetzli, optimized some procedure and added full jpeg format support.

Tested it on our GPU server(single Tesla M40 GPU), and the test result with one of our sample pictures(750*400 in size) is as below.

Method Usage Cost
Original guetzli <in file> <out file> 14.7s
Procedure Optimized guetzli --c <in file> <out file> 8.2s
Using OpenCL guetzli --opencl <in file> <out file> 1.5s
Using CUDA guetzli --cuda <in file> <out file> 0.8s

jpegtran from mozjpeg made slightly small files

I've made a test today with the bundled jpegtran (JPEGTRAN, version 9d 12-Jan-2020) and the one from mozjpeg version 4.1.0. Mozilla's generated slightly small files. Maybe it would be better to pack Mozilla's one.

Doesn't build on OS X

Problem description:

trying to rebuild binaries from scratch on latest OS X (10.14.4)

Revision:

master 78537e8

Environment:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
$ brew doctor
Your system is ready to brew.

XCode license agreement accepted, Developer Tools installed and properly configured, brew works fine.

Steps to reproduce:

  1. fetch current master version
  2. run script/run

Expected result:

Rebuilt binaries, no errors

Actual result:

checking whether the C compiler works... no
configure: error: in `/Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg':
configure: error: C compiler cannot create executables
See `config.log' for more details
make: *** [/Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/libjpeg.a] Error 77

Full config.log

$ cat build/darwin-i386/libmozjpeg/config.log
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by mozjpeg configure 3.1, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  $ ./configure --host i386-apple-darwin

## --------- ##
## Platform. ##
## --------- ##

hostname = MBP
uname -m = x86_64
uname -r = 18.5.0
uname -s = Darwin
uname -v = Darwin Kernel Version 18.5.0: Mon Mar 11 20:40:32 PDT 2019; root:xnu-4903.251.3~3/RELEASE_X86_64

/usr/bin/uname -p = i386
/bin/uname -X     = unknown

/bin/arch              = unknown
/usr/bin/arch -k       = unknown
/usr/convex/getsysinfo = unknown
/usr/bin/hostinfo      = Mach kernel version:
	 Darwin Kernel Version 18.5.0: Mon Mar 11 20:40:32 PDT 2019; root:xnu-4903.251.3~3/RELEASE_X86_64
Kernel configured for up to 4 processors.
2 processors are physically available.
4 processors are logically available.
Processor type: x86_64h (Intel x86-64h Haswell)
Processors active: 0 1 2 3
Primary memory available: 16.00 gigabytes
Default processor set: 363 tasks, 1309 threads, 4 processors
Load average: 2.75, Mach factor: 1.27
/bin/machine           = unknown
/usr/bin/oslevel       = unknown
/bin/universe          = unknown

PATH: /Users/x/.rvm/gems/ruby-2.6.1/bin
PATH: /Users/x/.rvm/gems/ruby-2.6.1@global/bin
PATH: /Users/x/.rvm/rubies/ruby-2.6.1/bin
PATH: /usr/local/bin
PATH: /usr/local/sbin
PATH: /usr/bin
PATH: /bin
PATH: /usr/sbin
PATH: /sbin
PATH: /Users/x/.rvm/bin


## ----------- ##
## Core tests. ##
## ----------- ##

configure:2679: checking for a BSD-compatible install
configure:2747: result: /usr/local/bin/ginstall -c
configure:2758: checking whether build environment is sane
configure:2813: result: yes
configure:2872: checking for i386-apple-darwin-strip
configure:2902: result: no
configure:2912: checking for strip
configure:2928: found /usr/bin/strip
configure:2939: result: strip
configure:2964: checking for a thread-safe mkdir -p
configure:3003: result: /usr/local/bin/gmkdir -p
configure:3010: checking for gawk
configure:3040: result: no
configure:3010: checking for mawk
configure:3040: result: no
configure:3010: checking for nawk
configure:3040: result: no
configure:3010: checking for awk
configure:3026: found /usr/bin/awk
configure:3037: result: awk
configure:3048: checking whether make sets $(MAKE)
configure:3070: result: yes
configure:3099: checking whether make supports nested variables
configure:3116: result: yes
configure:3253: checking whether make supports nested variables
configure:3270: result: yes
configure:3290: checking whether make supports the include directive
configure:3305: make -f confmf.GNU && cat confinc.out
this is the am__doit target
configure:3308: $? = 0
configure:3327: result: yes (GNU style)
configure:3357: checking for i386-apple-darwin-gcc
configure:3384: result: clang
configure:3653: checking for C compiler version
configure:3662: clang --version >&5
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
configure:3673: $? = 0
configure:3662: clang -v >&5
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
configure:3673: $? = 0
configure:3662: clang -V >&5
clang: error: unsupported option '-V -Wno-atomic-implicit-seq-cst'
clang: error: no input files
configure:3673: $? = 1
configure:3662: clang -qversion >&5
clang: error: unknown argument '-qversion', did you mean '--version'?
clang: error: no input files
configure:3673: $? = 1
configure:3693: checking whether the C compiler works
configure:3715: clang -O3 -arch i386 -O3 -arch i386 -O3 -arch i386 conftest.c  >&5
ld: warning: The i386 architecture is deprecated for macOS (remove from the Xcode build setting: ARCHS)
ld: warning: ignoring file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/lib/libSystem.tbd, missing required architecture i386 in file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/lib/libSystem.tbd
Undefined symbols for architecture i386:
  "_exit", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure:3719: $? = 1
configure:3757: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "mozjpeg"
| #define PACKAGE_TARNAME "mozjpeg"
| #define PACKAGE_VERSION "3.1"
| #define PACKAGE_STRING "mozjpeg 3.1"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define PACKAGE "mozjpeg"
| #define VERSION "3.1"
| /* end confdefs.h.  */
|
| int
| main ()
| {
|
|   ;
|   return 0;
| }
configure:3762: error: in `/Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg':
configure:3764: error: C compiler cannot create executables
See `config.log' for more details

## ---------------- ##
## Cache variables. ##
## ---------------- ##

ac_cv_env_CCASFLAGS_set=
ac_cv_env_CCASFLAGS_value=
ac_cv_env_CCAS_set=
ac_cv_env_CCAS_value=
ac_cv_env_CC_set=set
ac_cv_env_CC_value=clang
ac_cv_env_CFLAGS_set=set
ac_cv_env_CFLAGS_value='-O3 -arch i386'
ac_cv_env_CPPFLAGS_set=set
ac_cv_env_CPPFLAGS_value='-O3 -arch i386'
ac_cv_env_CPP_set=
ac_cv_env_CPP_value=
ac_cv_env_JAR_set=
ac_cv_env_JAR_value=
ac_cv_env_JAVACFLAGS_set=
ac_cv_env_JAVACFLAGS_value=
ac_cv_env_JAVAC_set=
ac_cv_env_JAVAC_value=
ac_cv_env_JAVA_set=
ac_cv_env_JAVA_value=
ac_cv_env_JNI_CFLAGS_set=
ac_cv_env_JNI_CFLAGS_value=
ac_cv_env_JPEG_LIB_VERSION_set=
ac_cv_env_JPEG_LIB_VERSION_value=
ac_cv_env_LDFLAGS_set=set
ac_cv_env_LDFLAGS_value='-O3 -arch i386'
ac_cv_env_LIBS_set=
ac_cv_env_LIBS_value=
ac_cv_env_LT_SYS_LIBRARY_PATH_set=
ac_cv_env_LT_SYS_LIBRARY_PATH_value=
ac_cv_env_PKGNAME_set=
ac_cv_env_PKGNAME_value=
ac_cv_env_PKG_CONFIG_LIBDIR_set=
ac_cv_env_PKG_CONFIG_LIBDIR_value=
ac_cv_env_PKG_CONFIG_PATH_set=set
ac_cv_env_PKG_CONFIG_PATH_value=/Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg
ac_cv_env_PKG_CONFIG_set=
ac_cv_env_PKG_CONFIG_value=
ac_cv_env_SO_MAJOR_VERSION_set=
ac_cv_env_SO_MAJOR_VERSION_value=
ac_cv_env_SO_MINOR_VERSION_set=
ac_cv_env_SO_MINOR_VERSION_value=
ac_cv_env_build_alias_set=
ac_cv_env_build_alias_value=
ac_cv_env_host_alias_set=set
ac_cv_env_host_alias_value=i386-apple-darwin
ac_cv_env_libpng_CFLAGS_set=
ac_cv_env_libpng_CFLAGS_value=
ac_cv_env_libpng_LIBS_set=
ac_cv_env_libpng_LIBS_value=
ac_cv_env_target_alias_set=
ac_cv_env_target_alias_value=
ac_cv_path_install='/usr/local/bin/ginstall -c'
ac_cv_path_mkdir=/usr/local/bin/gmkdir
ac_cv_prog_AWK=awk
ac_cv_prog_CC=clang
ac_cv_prog_ac_ct_STRIP=strip
ac_cv_prog_make_make_set=yes
am_cv_make_support_nested_variables=yes

## ----------------- ##
## Output variables. ##
## ----------------- ##

ACLOCAL='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/missing aclocal-1.16'
AMDEPBACKSLASH='\'
AMDEP_FALSE='#'
AMDEP_TRUE=''
AMTAR='$${TAR-tar}'
AM_BACKSLASH='\'
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
AM_DEFAULT_VERBOSITY='0'
AM_V='$(V)'
AR=''
AUTOCONF='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/missing autoconf'
AUTOHEADER='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/missing autoheader'
AUTOMAKE='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/missing automake-1.16'
AWK='awk'
BUILD='20190408'
CC='clang'
CCAS=''
CCASDEPMODE=''
CCASFLAGS=''
CCDEPMODE=''
CFLAGS='-O3 -arch i386'
CPP=''
CPPFLAGS='-O3 -arch i386'
CYGPATH_W='echo'
DEBARCH=''
DEFS=''
DEPDIR='.deps'
DLLTOOL=''
DSYMUTIL=''
DUMPBIN=''
ECHO_C='\c'
ECHO_N=''
ECHO_T=''
EGREP=''
EXEEXT=''
FGREP=''
GREP=''
HAVE_LIBPNG_FALSE=''
HAVE_LIBPNG_TRUE=''
INSTALL_DATA='${INSTALL} -m 644'
INSTALL_PROGRAM='${INSTALL}'
INSTALL_SCRIPT='${INSTALL}'
INSTALL_STRIP_PROGRAM='$(install_sh) -c -s'
JAR=''
JAVA=''
JAVAC=''
JAVACFLAGS=''
JAVA_RPM_CONTENTS_1=''
JAVA_RPM_CONTENTS_2=''
JNI_CFLAGS=''
JPEG_LIB_VERSION=''
JPEG_LIB_VERSION_DECIMAL=''
LD=''
LDFLAGS='-O3 -arch i386'
LIBOBJS=''
LIBS=''
LIBTOOL=''
LIBTOOL_CURRENT=''
LIPO=''
LN_S=''
LTLIBOBJS=''
LT_SYS_LIBRARY_PATH=''
MAKEINFO='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/missing makeinfo'
MANIFEST_TOOL=''
MEM_SRCDST_FUNCTIONS=''
MKDIR_P='/usr/local/bin/gmkdir -p'
NAFLAGS=''
NASM=''
NM=''
NMEDIT=''
OBJDUMP=''
OBJEXT=''
OTOOL64=''
OTOOL=''
PACKAGE='mozjpeg'
PACKAGE_BUGREPORT=''
PACKAGE_NAME='mozjpeg'
PACKAGE_STRING='mozjpeg 3.1'
PACKAGE_TARNAME='mozjpeg'
PACKAGE_URL=''
PACKAGE_VERSION='3.1'
PATH_SEPARATOR=':'
PKGNAME=''
PKG_CONFIG=''
PKG_CONFIG_LIBDIR=''
PKG_CONFIG_PATH='/Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg'
RANLIB=''
RPMARCH=''
RPM_CONFIG_ARGS=''
SED=''
SET_MAKE=''
SHELL='/bin/sh'
SIMD_ARM_64_FALSE=''
SIMD_ARM_64_TRUE=''
SIMD_ARM_FALSE=''
SIMD_ARM_TRUE=''
SIMD_I386_FALSE=''
SIMD_I386_TRUE=''
SIMD_MIPS_FALSE=''
SIMD_MIPS_TRUE=''
SIMD_POWERPC_FALSE=''
SIMD_POWERPC_TRUE=''
SIMD_X86_64_FALSE=''
SIMD_X86_64_TRUE=''
SO_AGE=''
SO_MAJOR_VERSION=''
SO_MINOR_VERSION=''
STRIP='strip'
VERSION='3.1'
VERSION_SCRIPT_FALSE=''
VERSION_SCRIPT_FLAG=''
VERSION_SCRIPT_TRUE=''
WITH_12BIT_FALSE=''
WITH_12BIT_TRUE=''
WITH_ARITH_DEC_FALSE=''
WITH_ARITH_DEC_TRUE=''
WITH_ARITH_ENC_FALSE=''
WITH_ARITH_ENC_TRUE=''
WITH_ARITH_FALSE=''
WITH_ARITH_TRUE=''
WITH_JAVA=''
WITH_JAVA_FALSE=''
WITH_JAVA_TRUE=''
WITH_SIMD_FALSE=''
WITH_SIMD_TRUE=''
WITH_SSE_FLOAT_DCT_FALSE=''
WITH_SSE_FLOAT_DCT_TRUE=''
WITH_TURBOJPEG_FALSE=''
WITH_TURBOJPEG_TRUE=''
X86_64_FALSE=''
X86_64_TRUE=''
ac_ct_AR=''
ac_ct_CC=''
ac_ct_DUMPBIN=''
am__EXEEXT_FALSE=''
am__EXEEXT_TRUE=''
am__fastdepCCAS_FALSE=''
am__fastdepCCAS_TRUE=''
am__fastdepCC_FALSE=''
am__fastdepCC_TRUE=''
am__include='include'
am__isrc=''
am__leading_dot='.'
am__nodep='_no'
am__quote=''
am__tar='$${TAR-tar} chof - "$$tardir"'
am__untar='$${TAR-tar} xf -'
bindir='${exec_prefix}/bin'
build=''
build_alias=''
build_cpu=''
build_os=''
build_vendor=''
datadir='${datarootdir}'
datarootdir='${prefix}/share'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
dvidir='${docdir}'
exec_prefix='NONE'
host='i386-apple-darwin'
host_alias='i386-apple-darwin'
host_cpu=''
host_os=''
host_vendor=''
htmldir='${docdir}'
includedir='${prefix}/include'
infodir='${datarootdir}/info'
install_sh='${SHELL} /Users/x/dev/toy/image_optim_pack/build/darwin-i386/libmozjpeg/install-sh'
libdir='${exec_prefix}/lib'
libexecdir='${exec_prefix}/libexec'
libpng_CFLAGS=''
libpng_LIBS=''
localedir='${datarootdir}/locale'
localstatedir='${prefix}/var'
mandir='${datarootdir}/man'
mkdir_p='$(MKDIR_P)'
oldincludedir='/usr/include'
pdfdir='${docdir}'
prefix='NONE'
program_transform_name='s,x,x,'
psdir='${docdir}'
sbindir='${exec_prefix}/sbin'
sharedstatedir='${prefix}/com'
sysconfdir='${prefix}/etc'
target_alias=''

## ----------- ##
## confdefs.h. ##
## ----------- ##

/* confdefs.h */
#define PACKAGE_NAME "mozjpeg"
#define PACKAGE_TARNAME "mozjpeg"
#define PACKAGE_VERSION "3.1"
#define PACKAGE_STRING "mozjpeg 3.1"
#define PACKAGE_BUGREPORT ""
#define PACKAGE_URL ""
#define PACKAGE "mozjpeg"
#define VERSION "3.1"

configure: exit 77```

Error: uninitialized constant EXIFR::JPEG

Have been using this without an issue for quite some time now but since the the update to 0.5.0.20170701 I'm getting the following error: uninitialized constant EXIFR::JPEG

Running on Ubuntu 16.04 with Ruby 2.3.3p222

Update: Seems I was wrong; the issue was actually due to updating exifr. Pegging it to 1.2.6 solved my issue...

image_optim_pack-0.5.0.20171208: uninitialized constant ImageOptim::BinResolver::Bin::Date

After updating to image_optim_pack-0.5.0.20171208 I receive an error while running image_optim:

$ image_optim --info
image_optim v0.26.0
config:
  verbose: true
nice: 10
threads: 8
pack: true
skip_missing_workers: true
allow_lossy: false
cache_dir: 
cache_worker_digests: false
image_optim_pack: all bins from /Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim_pack-0.5.0.20171208-x86_64-darwin/vendor/darwin-x86_64 worked
Resolved pngcrush 1.8.13 at /Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim_pack-0.5.0.20171208-x86_64-darwin/vendor/darwin-x86_64/pngcrush
uninitialized constant ImageOptim::BinResolver::Bin::Date
Did you mean?  Data
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver/bin.rb:97:in `version_string'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver/bin.rb:77:in `detect_version'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver/bin.rb:20:in `initialize'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:36:in `new'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:36:in `block in resolve!'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:101:in `block in resolving'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:100:in `synchronize'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:100:in `resolving'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:34:in `resolve!'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim.rb:217:in `resolve_bin!'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/worker.rb:68:in `block in resolve_used_bins!'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:72:in `block in collect_errors'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:70:in `each'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:70:in `collect_errors'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/worker.rb:67:in `resolve_used_bins!'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/worker/class_methods.rb:63:in `block in create_all'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:72:in `block in collect_errors'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:70:in `each'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/bin_resolver.rb:70:in `collect_errors'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/worker/class_methods.rb:62:in `create_all'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/worker/class_methods.rb:44:in `create_all_by_format'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim.rb:86:in `initialize'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/runner.rb:54:in `new'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/lib/image_optim/runner.rb:54:in `initialize'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/bin/image_optim:17:in `new'
/Users/hans/.rvm/gems/ruby-2.3.1/gems/image_optim-0.26.0/bin/image_optim:17:in `<top (required)>'
/Users/hans/.rvm/gems/ruby-2.3.1/bin/image_optim:23:in `load'
/Users/hans/.rvm/gems/ruby-2.3.1/bin/image_optim:23:in `<main>'

When I specify --no-pngout then everything works again.

I updated through this command, with this output:

$ gem update
Updating installed gems
Updating exifr
Fetching: exifr-1.3.3.gem (100%)
Successfully installed exifr-1.3.3
Updating image_optim_pack
Fetching: image_optim_pack-0.5.0.20171208-x86_64-darwin.gem (100%)
Successfully installed image_optim_pack-0.5.0.20171208-x86_64-darwin
Updating psych
Fetching: psych-3.0.1.gem (100%)
Building native extensions. This could take a while...
Successfully installed psych-3.0.1
Updating rdoc
Fetching: rdoc-6.0.0.gem (100%)
Successfully installed rdoc-6.0.0
Updating test-unit
Fetching: test-unit-3.2.7.gem (100%)
Successfully installed test-unit-3.2.7
Gems updated: exifr image_optim_pack psych rdoc test-unit
Darwin iMac-van-Hans-van-Eijsden.local 17.3.0 Darwin Kernel Version 17.3.0: Thu Nov  9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 x86_64

I also have this exact problem on Debian 9:

$ uname -a
Linux web319 4.13.0-0.bpo.1-amd64 #1 SMP Debian 4.13.13-1~bpo9+1 (2017-11-22) x86_64 GNU/Linux

Let me know if you need more info! Thanks.

pngout and svgo not found (with default options)

I use image_optim as follows:

      image_optim = ImageOptim.new allow_lossy: true
      image_optim.optimize_images!(Dir["#{File.dirname(file.file)}/*.png"])

This results in messages in the console:

pngout worker: `pngout` not found; please provide proper binary or disable this worker (--no-pngout argument or `:pngout => false` through options)
svgo worker: `svgo` not found; please provide proper binary or disable this worker (--no-svgo argument or `:svgo => false` through options)

When using

      image_optim = ImageOptim.new allow_lossy: true,
                                   pngout: false,
                                   svgo: false

it works without errors.

Unable to use the platform-specific (x86_64-linux) version of image_optim_pack

I'm seeing a new error message when deploying to Heroku:

Unable to use the platform-specific (x86_64-linux) version of image_optim_pack (0.6.0.20200215) because it has different dependencies from the ruby version. To use the platform-specific version of the gem, run `bundle config set specific_platform true` and install again.

Bundler 2.0.2
Ruby 2.7.1

pngout licence changed? Maybe can be packaged now?

From http://advsys.net/ken/utils.htm#pngoutkziplicense
Regarding redistribution, this is what I see currently:

  • Redistributing, repackaging, or reusing the PNGOUT or KZIP executable is permitted for non-commercial projects that are distributed freely.
  • For commercial requests (such as bundling with a commercial product), please write to my business partner, David Blake.
  • When bundling, my credit (both my name and website) must be clearly displayed in some reasonable fashion that can be seen by an average user.

I believe that means it should be ok to include the binary in the pack?

Debian [ARM64] `jpeg-recompress` and `oxipng` require `/lib64/ld-linux-x86-64.so.2`

MacOS, M1 pro processor

For documenting a case, without expectation for a solution. Task can be closed anytime.

Technically I build Debian, but for ARM

# docker build -t images.arm64 -f Dockerfile --build-arg BUILDPLATFORM="linux/arm64" ../
# docker push images.arm64
# docker run -ti images.arm64 bash

Dockerfile

FROM ghcr.io/toy/image_optim:20230129-debian as image_optim

# Debian GNU/Linux 11 (bullseye)
FROM --platform=$BUILDPLATFORM ruby:3.2
ARG BUILDPLATFORM
RUN echo "$BUILDPLATFORM" > /BUILDPLATFORM

RUN apt-get update

# Can be installed via apt-get
RUN apt-get install -y \
    advancecomp \
    gifsicle \
    jhead \
    jpegoptim \
    libjpeg-progs \
    optipng \
    pngcrush \
    pngquant

# Next things I copy from `image_optim` to save efforts

# It is fine
COPY --from=image_optim /usr/local/bin/pngout          /usr/bin/
# /lib64/ld-linux-x86-64.so.2
COPY --from=image_optim /usr/local/bin/jpeg-recompress /usr/bin/
# /lib64/ld-linux-x86-64.so.2
COPY --from=image_optim /usr/local/bin/oxipng          /usr/bin/
# oxipng -v
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory

ld-linux-x86-64.so.2 exists for amd/386, but can not be installed for arm64 platform.

https://packages.debian.org/search?searchon=contents&keywords=ld-linux-x86-64.so.2

So, for now I do not see options to install jpeg-recompress and oxipng on debian under arm64

pngcrush worker: `pngcrush` not found; please provide proper binary or disable this worker

Hi,
First-time using so the error may be due to my ignorance.
Windows10x64
I get this

pngcrush worker: `pngcrush` not found; please provide proper binary or disable this worker (--no-pngcrush argument or `:pngcrush => false` through options)

bundle exec image_optim --inf provides:

image_optim v0.27.1
config:
  verbose: true
nice: 10
threads: 12
pack: true
skip_missing_workers: true
allow_lossy: false
cache_dir:
cache_worker_digests: false
image_optim_pack: advpng, gifsicle, jhead, jpeg-recompress, jpegoptim, jpegtran, optipng, pngcrush from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/image_optim_pack-0.7.0/vendor/linux-i686 failed
image_optim_pack: advpng, gifsicle, jhead, jpeg-recompress, jpegoptim, jpegtran, optipng, pngcrush from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/image_optim_pack-0.7.0/vendor/linux-x86_64 failed
image_optim_pack: advpng, gifsicle, jhead, jpeg-recompress, jpegoptim, jpegtran, optipng, pngcrush from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/image_optim_pack-0.7.0/vendor/darwin-x86_64 failed
No pack for this OS and/or ARCH, check verbose output
PATH: C:/Ruby27-x64/lib/ruby/gems/2.7.0/bin;C:\Python38\Scripts\;C:\Python38\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\dotnet\;C:\Program Files\Calibre2\;C:\ProgramData\chocolatey\bin;C:\Program Files (x86)\Yarn\bin\;C:\Program Files (x86)\Gpg4win\..\GnuPG\bin;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\PuTTY\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\curl-7.74.0-win64-mingw\bin;C:\Ruby27-x64\bin;C:\Users\Pavle\AppData\Local\Microsoft\WindowsApps;C:\Users\Pavle\AppData\Local\GitHubDesktop\bin;C:\Users\Pavle\.dotnet\tools;C:\Users\Pavle\AppData\Local\Yarn\bin;C:\Users\Pavle\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\Pavle\AppData\Roaming\npm;C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/image_optim-0.27.1/vendor
Resolved jpegrescan eead8f79 at C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/image_optim-0.27.1/vendor/jpegrescan.BAT
pngcrush worker: `pngcrush` not found; please provide proper binary or disable this worker (--no-pngcrush argument or `:pngcrush => false` through options)
pngout worker: `pngout` not found; please provide proper binary or disable this worker (--no-pngout argument or `:pngout => false` through options)
advpng worker: `advpng` not found; please provide proper binary or disable this worker (--no-advpng argument or `:advpng => false` through options)
optipng worker: `optipng` not found; please provide proper binary or disable this worker (--no-optipng argument or `:optipng => false` through options)
pngquant worker: `pngquant` not found; please provide proper binary or disable this worker (--no-pngquant argument or `:pngquant => false` through options)
jhead worker: `jhead` not found, `jpegtran` not found; please provide proper binary or disable this worker (--no-jhead argument or `:jhead => false` through options)
jpegoptim worker: `jpegoptim` not found; please provide proper binary or disable this worker (--no-jpegoptim argument or `:jpegoptim => false` through options)
jpegtran worker: `jpegtran` not found; please provide proper binary or disable this worker (--no-jpegtran argument or `:jpegtran => false` through options)
gifsicle worker: `gifsicle` not found; please provide proper binary or disable this worker (--no-gifsicle argument or `:gifsicle => false` through options)
svgo worker: `svgo` not found; please provide proper binary or disable this worker (--no-svgo argument or `:svgo => false` through options)

Any idea of what I'm missing?

Not sure if it means anything but gemfile

IT
  remote: https://github.com/valerijaspasojevic/jekyll-compress-images.git
  revision: af7c2e0527371a7b88d11d594cef9538b83230f1
  specs:
    jekyll-compress-images (1.2)
      image_optim
      image_optim_pack

GEM
  remote: https://rubygems.org/
  specs:
    addressable (2.7.0)
      public_suffix (>= 2.0.2, < 5.0)
    colorator (1.1.0)
    concurrent-ruby (1.1.6)
    em-websocket (0.5.1)
      eventmachine (>= 0.12.9)
      http_parser.rb (~> 0.6.0)
    ethon (0.12.0)
      ffi (>= 1.3.0)
    eventmachine (1.2.7)
    eventmachine (1.2.7-x64-mingw32)
    exifr (1.3.9)
    ffi (1.13.1)
    ffi (1.13.1-x64-mingw32)
    forwardable-extended (2.6.0)
    fspath (3.1.2)
    html-proofer (3.18.0)
      addressable (~> 2.3)
      mercenary (~> 0.3)
      nokogumbo (~> 2.0)
      parallel (~> 1.3)
      rainbow (~> 3.0)
      typhoeus (~> 1.3)
      yell (~> 2.0)
    http_parser.rb (0.6.0)
    i18n (1.8.3)
      concurrent-ruby (~> 1.0)
    image_optim (0.27.1)
      exifr (~> 1.2, >= 1.2.2)
      fspath (~> 3.0)
      image_size (>= 1.5, < 3)
      in_threads (~> 1.3)
      progress (~> 3.0, >= 3.0.1)
    image_optim_pack (0.7.0)
      fspath (>= 2.1, < 4)
      image_optim (~> 0.19)
    image_size (2.1.0)
    in_threads (1.5.4)
    jekyll (4.1.1)
      addressable (~> 2.4)
      colorator (~> 1.0)
      em-websocket (~> 0.5)
      i18n (~> 1.0)
      jekyll-sass-converter (~> 2.0)
      jekyll-watch (~> 2.0)
      kramdown (~> 2.1)
      kramdown-parser-gfm (~> 1.0)
      liquid (~> 4.0)
      mercenary (~> 0.4.0)
      pathutil (~> 0.9)
      rouge (~> 3.0)
      safe_yaml (~> 1.0)
      terminal-table (~> 1.8)
    jekyll-feed (0.14.0)
      jekyll (>= 3.7, < 5.0)
    jekyll-sass-converter (2.1.0)
      sassc (> 2.0.1, < 3.0)
    jekyll-seo-tag (2.6.1)
      jekyll (>= 3.3, < 5.0)
    jekyll-watch (2.2.1)
      listen (~> 3.0)
    kramdown (2.3.0)
      rexml
    kramdown-parser-gfm (1.1.0)
      kramdown (~> 2.0)
    liquid (4.0.3)
    listen (3.2.1)
      rb-fsevent (~> 0.10, >= 0.10.3)
      rb-inotify (~> 0.9, >= 0.9.10)
    mercenary (0.4.0)
    mini_portile2 (2.4.0)
    minima (2.5.1)
      jekyll (>= 3.5, < 5.0)
      jekyll-feed (~> 0.9)
      jekyll-seo-tag (~> 2.1)
    nokogiri (1.10.10)
      mini_portile2 (~> 2.4.0)
    nokogiri (1.10.10-x64-mingw32)
      mini_portile2 (~> 2.4.0)
    nokogumbo (2.0.4)
      nokogiri (~> 1.8, >= 1.8.4)
    parallel (1.20.1)
    pathutil (0.16.2)
      forwardable-extended (~> 2.6)
    progress (3.5.2)
    public_suffix (4.0.5)
    rainbow (3.0.0)
    rb-fsevent (0.10.4)
    rb-inotify (0.10.1)
      ffi (~> 1.0)
    rexml (3.2.4)
    rouge (3.20.0)
    safe_yaml (1.0.5)
    sassc (2.4.0)
      ffi (~> 1.9)
    sassc (2.4.0-x64-mingw32)
      ffi (~> 1.9)
    terminal-table (1.8.0)
      unicode-display_width (~> 1.1, >= 1.1.1)
    thread_safe (0.3.6)
    typhoeus (1.4.0)
      ethon (>= 0.9.0)
    tzinfo (1.2.8)
      thread_safe (~> 0.1)
    tzinfo-data (1.2020.4)
      tzinfo (>= 1.0.0)
    unicode-display_width (1.7.0)
    wdm (0.1.1)
    yell (2.2.2)

PLATFORMS
  ruby
  x64-mingw32

DEPENDENCIES
  html-proofer
  jekyll (~> 4.1.1)
  jekyll-compress-images!
  jekyll-feed (~> 0.12)
  jekyll-seo-tag
  minima (~> 2.5)
  tzinfo (~> 1.2)
  tzinfo-data
  wdm (~> 0.1.1)

BUNDLED WITH
   2.1.4

Remove (nearly-)unused platforms

Following an experiment with fake platform gem, per platform downloads table show that downloads of freebsd and openbsd platform gems are very low (rarely going over fake platform gem). Supporting multiple platforms makes it harder to do anything beside maintenance, so support of freebsd and openbsd is going to be removed.

+----------------+------+----------+--------+--------+------+---------+---------+-------+---------+---------+---------+-------+
| version        | days | base dls | darwin | darwin | fake | freebsd | freebsd | linux | linux   | openbsd | openbsd | ruby  |
|                |      |          | x86    | x86_64 | x42  | x86     | amd64   | x86   | x86_64  | x86     | x86_64  |       |
+----------------+------+----------+--------+--------+------+---------+---------+-------+---------+---------+---------+-------+
| 0.5.6.20190728 |   18 |      160 |     +4 |  +1455 |   +6 |      +4 |       = |    +6 |   +3419 |      +4 |      +2 |  +320 |
| 0.5.6          |   10 |      160 |    +25 |   +734 |   +2 |       = |       = |    +2 |   +2076 |      +2 |      +2 |  +281 |
| 0.5.5          |    4 |      166 |     +1 |   +779 |   +1 |       = |       = |    +5 |   +1340 |      +1 |      +3 |  +150 |
+----------------+------+----------+--------+--------+------+---------+---------+-------+---------+---------+---------+-------+

Missing binaries error in production

I've asked this on StackOverflow but maybe it's more generic than just my own issue?

I'm trying to deploy a Rails app with paperclip-optimizer and it's giving me an error about missing binaries. I have bundled image_optim_pack to provide the binaries but still get this:

ImageOptim::BinResolver::Error occurred
pngcrush worker: `pngcrush` not found; please provide proper binary or di=
sable this worker (--no-pngcrush argument or `:pngcrush =3D> false` throu=
gh options)
advpng worker: `advpng` not found; please provide proper binary or disabl=
e this worker (--no-advpng argument or `:advpng =3D> false` through optio=
ns)
optipng worker: `optipng` not found; please provide proper binary or disa=
ble this worker (--no-optipng argument or `:optipng =3D> false` through o=
ptions)
pngquant worker: `pngquant` not found; please provide proper binary or di=
sable this worker (--no-pngquant argument or `:pngquant =3D> false` throu=
gh options)
jhead worker: `jhead` not found, `jpegtran` not found; please provide pro=
per binary or disable this worker (--no-jhead argument or `:jhead =3D> fa=
lse` through options)
jpegoptim worker: `jpegoptim` not found; please provide proper binary or =
disable this worker (--no-jpegoptim argument or `:jpegoptim =3D> false` t=
hrough options)
jpegtran worker: `jpegtran` not found; please provide proper binary or di=
sable this worker (--no-jpegtran argument or `:jpegtran =3D> false` throu=
gh options)
gifsicle worker: `gifsicle` not found; please provide proper binary or di=
sable this worker (--no-gifsicle argument or `:gifsicle =3D> false` throu=
gh options)
  • Server Ubuntu 14.04.5 LTS
  • Rails 5.1.4
  • Ruby 2.4.1
  • nginx 1.9.10
  • passenger 5.0.24
  • image_optim (0.25.0)
  • image_optim_pack (0.5.0.20170831 x86_64-linux)

Request for help with imagemagick with heic support 😬

Hi @toy,

I know this has nothing to do with this gem per say, so I'm sorry in advance if this bothers you.

The thing is: I think you did such an amazing job putting this gem together that bundles all this compiled binaries that I want to suggest you put your knowledge to help in a related project 😬

It would be so nice if I could just drop a gem inside my Rails app to have ImageMagick working without having to hassle with make and manual install/compiles in my Ubuntu server... I'm a Rails dev and not a sysadmin. Things are getting so complicated that to install ImageMagick with heic support (file format used by all new iPhones) one has to fiddle with 2 different git repos and build them manually:

https://medium.com/@eplt/5-minutes-to-install-imagemagick-with-heic-support-on-ubuntu-18-04-digitalocean-fe2d09dcef1

Is this something you could help by making a gem that packages all these dependencies into a neat gem like this one here?

Docker. Debian. Some additional libs are required

I used the original image to copy precompiled bins.
Not sure if I did it fully correctly, but looks promising.

When I started to check executable files I found, that some of them needs for some additional dependencies.

Maybe it worth to mention somewhere in documentation.

COPY --from=image_optim /lib/ld-musl-x86_64.so.1   /lib/
COPY --from=image_optim /usr/lib/libstdc++.so.6    /usr/lib/
COPY --from=image_optim /usr/lib/libgcc_s.so.1     /usr/lib/
FROM ghcr.io/toy/image_optim:20221127 as image_optim

FROM debian:10.13

COPY --from=image_optim /usr/local/bin/advpng          /usr/local/bin/
COPY --from=image_optim /usr/local/bin/gifsicle        /usr/local/bin/
COPY --from=image_optim /usr/local/bin/jhead           /usr/local/bin/
COPY --from=image_optim /usr/local/bin/jpeg-recompress /usr/local/bin/
COPY --from=image_optim /usr/local/bin/jpegoptim       /usr/local/bin/
COPY --from=image_optim /usr/local/bin/jpegtran        /usr/local/bin/
COPY --from=image_optim /usr/local/bin/optipng         /usr/local/bin/
COPY --from=image_optim /usr/local/bin/oxipng          /usr/local/bin/
COPY --from=image_optim /usr/local/bin/pngcrush        /usr/local/bin/
COPY --from=image_optim /usr/local/bin/pngout          /usr/local/bin/
COPY --from=image_optim /usr/local/bin/pngquant        /usr/local/bin/

COPY --from=image_optim /usr/local/lib/libjpeg.so.9    /usr/local/lib/
COPY --from=image_optim /usr/local/lib/libpng16.so.16  /usr/local/lib/
COPY --from=image_optim /usr/local/lib/libz.so.1       /usr/local/lib/
COPY --from=image_optim /usr/local/lib/liblcms2.so.2   /usr/local/lib/

# Added manually by me

COPY --from=image_optim /lib/ld-musl-x86_64.so.1   /lib/
COPY --from=image_optim /usr/lib/libstdc++.so.6    /usr/lib/
COPY --from=image_optim /usr/lib/libgcc_s.so.1     /usr/lib/

Can't find binaries after installation

Hey Ivan,

Maybe I'm doing something wrong, but after bundle install I can't see any of those libraries.
It doesn't put any libs into bin folder. I also tried to run bundle install --binstubs but no success. It generates a bunch bins for other gems, but no libs from this gem.
Gemfile does include:

gem 'image_optim', '~> 0.20.2'
gem 'image_optim_pack'

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.