SlideShare a Scribd company logo
How to save the
environment
..and get rid of virtualenv, rvm, pythonbrew, rbenv, pythonz (...)
FOSDEM 2014 - Brussels, Belgium, Old World
Earth, Orion–Cygnus Arm, Milky Way
Aaron Zauner
azet@azet.org
@a_z_e_t
`whoami`
Self-employed engineer
currently involved in
IT-Infrastructure, HPC
and security stuff
primarily working for
biology institutes of
the austrian academy
of sciences

Used to do
Web/Mail and Datacenter
Operations
Front/Backend Dev.
Security auditing
FOSS/Community (BSD)
[…]
Slide intentionally left blank for your enjoyment.
Text

‘Environment Modules’
First officially published at LISA V back in 1991 by John L. Furlani
Environment Modules
In use ever since in High Performance and Scientific
Computing
Ease of administration
Ease of use
Environment Modules
by most just refered to as “Modules”
originally intended to enable multiple users to have software in different versions
available
traditionally most HPC environments do not use system packages
special compilers, toolchains, math libraries, optimisation, interconnect-specifics […]
and often scientific software is not to be found in $distro repo (because it’s crap ||
not used outside the sci. community)
somewhat like Gentoo or Arch - but a lot more cumbersome for sysadmins and
users
a system to manage multiple versions of the same software with different toolchains
is needed that is easy to maintain
and easy for users (developers and scientists, usually) to learn and use
Environment Modules
“modulefiles” dynamically set an environment specific to a software
may load/unload other modulefiles if there is a dependency present
examples include but are not limited to
PATH
MANPATH
LD_LIBRARY_PATH
LD_PRELOAD
Environment Modules

(with Lmod - more on that later)
!
!
whatis("Git is a free and open source distributed version
control system designed to handle everything from small to
very large projects with speed and efficiency. - Homepage:
http://git-scm.com/“)
!
conflict("git")
!
prepend_path(“LD_LIBRARY_PATH","/software/git/1.8.2/lib")
prepend_path("LD_LIBRARY_PATH","/software/git/1.8.2/lib64")
prepend_path(“MANPATH","/software/git/1.8.2/share/man")
!
[…]
Environment Modules: Implementations

http://xkcd.com/927/
Creative Commons Attribution-NonCommercial 2.5 License
Environment Modules: Implementations
“Classical Modules” (Furlani et. al.): C/Tcl
still in use at arguably most HPC sites

modules.sourceforge.net

!

modules-tcl (Kent Mein of UMN): Tcl

http://sourceforge.net/p/modules/modules-tcl

Cmod (Per Cederqvist et. al.): C

http://www.lysator.liu.se/cmod/

Lmod (Robert McLay of TACC): Lua

https://www.tacc.utexas.edu/tacc-projects/lmod

similar systems:

!

SoftEnv (by and in use at Argonne
National Lab): Csh

http://www.mcs.anl.gov/hs/software/systems/
softenv/softenv-admin.html

dotkit (by and in use at Lawrence
Livermore National Lab): *Shell

https://computing.llnl.gov/?
set=jobs&page=dotkit
Environment Modules: Implementations
“Classical Modules” (Furlani et. al.): C/Tcl
still in use at arguably most HPC sites

modules.sourceforge.net

!

modules-tcl (Kent Mein of UMN): Tcl

http://sourceforge.net/p/modules/modules-tcl

Cmod (Per Cederqvist et. al.): C

http://www.lysator.liu.se/cmod/

Lmod (Robert McLay of TACC): Lua

https://www.tacc.utexas.edu/tacc-projects/lmod

similar systems:

!

SoftEnv (by and in use at Argonne
National Lab): Csh

http://www.mcs.anl.gov/hs/software/systems/
softenv/softenv-admin.html

dotkit (by and in use at Lawrence
Livermore National Lab): *Shell

https://computing.llnl.gov/?
set=jobs&page=dotkit
Modules in the 21st century: Lmod
I’ll focus on Lmod from now on, though most things will work with other systems as well
Very actively maintained by one of the most awesome maintainers we’ve seen in an open-source
project
Active community
Cool new features:
automatic swapping of modules, if applicable
conflict detection (i.e. two compilers loaded at the same time)
loading of modules with “atleast”, “between” and “latest” w.r.t software versions
Spider (searching) and Keywords
Caching
Modules in the 21st century: Lmod
I’ll focus on Lmod from now on, though most things will work with other systems as well
Very actively maintained by one of the most awesome maintainers we’ve seen in an open-source
project
Active community
Cool new features:
Hooks (e.g. function call every time a module is loaded)
tcl2lua wrapper for conversion of old module files
shell script/environment to Lua wrapper
GPU and Xeon Phi specifics (colors :D)
[…]
Environment Modules: In Action
module avail
----------------- /net/gmi.oeaw.ac.at/software/mendel/intel-x86_64-sandybridge-avx/modules/devel -----------------Autoconf/2.69-goolf-1.4.10
SCons/2.3.0-ictce-5.3.0-Python-2.7.3
(D)
Automake/1.13.1-goolf-1.4.10
SWIG/2.0.4-goolf-1.4.10-Python-2.7.3
Boost/1.51.0-goolf-1.4.10-Python-2.7.3
ZeroMQ/2.2.0-goolf-1.4.10
Boost/1.51.0-goolf-1.4.10
(D)
ant/1.8.4-Java-1.7.0_10
CMake/2.8.4-goolf-1.4.10
gperf/3.0.4-goolf-1.4.10
CMake/2.8.11-goolf-1.4.10
guile/1.8.8-goolf-1.4.10
CMake/2.8.12-GCC-4.7.2
(D)
ncurses/5.9-GCC-4.7.2
Greenlet/0.4.1-goolf-1.4.10-Python-2.7.3
ncurses/5.9-goalf-1.1.0-no-OFED
JUnit/4.10-Java-1.7.0_10
ncurses/5.9-goolf-1.4.10
LZO/2.06-goolf-1.4.10
ncurses/5.9-ictce-5.2.0
LZO/2.06-ictce-5.3.0
(D)
ncurses/5.9-ictce-5.3.0
(D)
M4/1.4.16-goolf-1.4.10
pkg-config/0.27.1-goolf-1.4.10
PCRE/8.12-goolf-1.4.10
setuptools/0.6c11-goolf-1.4.10-Python-2.7.3
PCRE/8.12-ictce-5.3.0
(D)
setuptools/0.7.8-goolf-1.4.10-Python-2.7.3
PyZMQ/2.2.0.1-goolf-1.4.10-Python-2.7.3-zmq2
setuptools/2.0.1-goolf-1.4.10-Python-2.7.3
(D)
SCons/2.3.0-goolf-1.4.10-Python-2.7.3

!

(only a small subset of the modules at this site)
Environment Modules: In Action
module load

aaron.zauner@login0 [~]> python --version
Python 2.6.8
aaron.zauner@login0 [~]> module load Python/2.7.3-ictce-5.3.0
aaron.zauner@login0 [~]> python --version
Python 2.7.3
Environment Modules: In Action
module swap

!

aaron.zauner@login0 [~]> module swap Python Python/2.7.5-goolf-1.4.10

The following have been reloaded with a version change:
1) bzip2/1.0.6-ictce-5.3.0 => bzip2/1.0.6-goolf-1.4.10
2) libreadline/6.2-ictce-5.3.0 => libreadline/6.2-goolf-1.4.10
3) ncurses/5.9-ictce-5.3.0 => ncurses/5.9-goolf-1.4.10
4) zlib/1.2.7-ictce-5.3.0 => zlib/1.2.8-goolf-1.4.10

!

aaron.zauner@login0 [~]> python --version
Python 2.7.5
Environment Modules: In Action
module spider
!
!

!
!
!
!
!
!

aaron.zauner@login0 [~]> module spider setuptools
--------------------------------------------------------------------------------------------------------------setuptools:
--------------------------------------------------------------------------------------------------------------Versions:
setuptools/0.6c11-goolf-1.4.10-Python-2.7.3
setuptools/0.7.8-goolf-1.4.10-Python-2.7.3
setuptools/2.0.1-goolf-1.4.10-Python-2.7.3
--------------------------------------------------------------------------------------------------------------To find detailed information about setuptools please enter the full name.
For example:
$ module spider setuptools/2.0.1-goolf-1.4.10-Python-2.7.3
---------------------------------------------------------------------------------------------------------------
Environment Modules: In Action
module list
!

aaron.zauner@login0 [~]> module list

Currently Loaded Modules:
1) std_env
2) gmi_term_color
3) gmi_resources
4) ictce/5.3.0
5) icc/2013.3.163
6) ifort/2013.3.163
7) impi/4.1.0.030
8) imkl/11.0.3.163
9) Python/2.7.5-goolf-1.4.10
10) goolf/1.4.10
11) GCC/4.7.2

!
!
!
!
!

12)
13)
14)
15)
16)
17)
18)
19)
20)
21)

OpenMPI/1.6.4-GCC-4.7.2
hwloc/1.6.2-GCC-4.7.2
OpenBLAS/0.2.6-gompi-1.4.10-LAPACK-3.4.2
gompi/1.4.10
FFTW/3.3.3-gompi-1.4.10
ScaLAPACK/2.0.2-gompi-1.4.10-OpenBLAS-0.2.6-LAPACK-3.4.2
bzip2/1.0.6-goolf-1.4.10
zlib/1.2.8-goolf-1.4.10
libreadline/6.2-goolf-1.4.10
ncurses/5.9-goolf-1.4.10
Environment Modules: In Action
module display
!

aaron.zauner@login0 [~]> module display GCC/4.7.2

--------------------------------------------------------------------------------------------------------------/net/gmi.oeaw.ac.at/software/mendel/intel-x86_64-sandybridge-avx/modules/compiler/GCC/4.7.2:
--------------------------------------------------------------------------------------------------------------whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran,
Java, and Ada, as well
as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/")
conflict("GCC")
prepend_path("CPATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/include")
prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib")
prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib64")
prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib/gcc/x86_64unknown-linux-gnu/4.7.2")
prepend_path("MANPATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/share/man")
prepend_path("PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/bin")
setenv("EBROOTGCC","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2")
setenv("EBVERSIONGCC","4.7.2")
setenv("EBDEVELGCC","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/easybuild/GCC-4.7.2easybuild-devel")
help([[
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran,
Java, and Ada, as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/

!
]])
!
!
Environment Modules: In Action

..A lot more to show but time is limited..
!
Modules for FOSS Devs.
Still largely unkown and unused in the FOSS community
Could be a reasonable replacement for the vast number
of language specific environment abstraction tools as in
use today
There’s really no reason not to use it (that I know of)
I’ll demonstrate on two prominent examples
Examples: RVM
“Ruby enVironment (Version) Manager” [sic!]
20k lines of shell script, now being rewritten in Ruby
basically installs and manages multiple versions of Ruby
also does a couple of other cool things
recently did a fundraiser for 50k USD to do the rewrite to Ruby
actually has corporate sponsoring
Sorry to say this: I develop Ruby code and It’s a bloated piece of shit that fucks up
your environment beyond repair. Won’t ever use it again, ever. ever.
Of course web developers love the hell out of it
Examples: RVM
rvm install ruby-2
installs Ruby2 from source, downloads dependencies.
wow. such magic. many hax. much sophisticate
rvm list
rvm use ruby-2
rvm use 1.9.2 —default
does any of that sound familiar? right.
Examples: RVM
azet@debian:~$ rvm use ruby-2
Using /home/azet/.rvm/gems/ruby-2.1.0
azet@debian:~$ set -v; rvm use system &>gimmethepain
azet@debian:~$ wc -l gimmethepain
6458 gimmethepain
azet@debian:~$
!

Yes. It takes ~6.5k lines of bash code to switch the Ruby
version in the current environment with RVM.
“Always code as if the person who ends up
maintaining your code is a violent psychopath who
knows where you live.”
Examples: RVM
Environmental pollution fact: RVM screws with `cd`.

azet@debian:~$ set -x
azet@debian:~$ cd ~
+ cd /home/azet
+ builtin cd /home/azet
+ [[ -n '' ]]
+ true
+ __rvm_cd_functions_set
+ __rvm_do_with_env_before
+ [[ -n '' ]]
+ [[ -n /home/azet/.rvm ]]
+ source /home/azet/.rvm/scripts/initialize
++ : rvm_trace_flag:0
++ (( rvm_trace_flag > 0 ))
++ [[ -n 4.2.45(1)-release ]]
++ shopt -s extglob
++ export __rvm_env_loaded
++ : __rvm_env_loaded:0:
++ : __rvm_env_loaded:1:
++ [[ -z '' ]]
++ typeset -f __rvm_cleanse_variables
++ __rvm_cleanse_variables
++ __rvm_unset_ruby_variables
++ unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path
rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version
rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch
rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file
rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag
++ __rvm_load_rvmrc
++ typeset _file
++ typeset -a rvm_rvmrc_files
++ (( 0 == 1 ))

..this goes on for another 148 lines of executed bullshit. 170 total 

for every `cd` you type after installing RVM. yup. isn’t that great?
Examples: RVM
Environmental pollution fact: RVM screws with `cd`.

azet@debian:~$ set -x
azet@debian:~$ cd ~
+ cd /home/azet
+ builtin cd /home/azet
+ [[ -n '' ]]
+ true
+ __rvm_cd_functions_set
+ __rvm_do_with_env_before
+ [[ -n '' ]]
+ [[ -n /home/azet/.rvm ]]
+ source /home/azet/.rvm/scripts/initialize
++ : rvm_trace_flag:0
++ (( rvm_trace_flag > 0 ))
++ [[ -n 4.2.45(1)-release ]]
++ shopt -s extglob
++ export __rvm_env_loaded
++ : __rvm_env_loaded:0:
++ : __rvm_env_loaded:1:
++ [[ -z '' ]]
++ typeset -f __rvm_cleanse_variables
++ __rvm_cleanse_variables
++ __rvm_unset_ruby_variables
++ unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path
rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version
rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch
rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file
rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag
++ __rvm_load_rvmrc
++ typeset _file
++ typeset -a rvm_rvmrc_files
++ (( 0 == 1 ))

..this goes on for another 148 lines of executed bullshit. 170 total 

for every `cd` you type after installing RVM. yup. isn’t that great?
Examples: RVM
azet@debian:~$ time cd
!
real 0m0.009s
user 0m0.004s
sys 0m0.004s
azet@debian:~$ rvm implode
[…]
azet@debian:~$ time cd
!
real 0m0.000s
user 0m0.000s
sys 0m0.000s
!

..if you really do not like modules, please use rbenv instead

a lot more to tell about RVM but lets move on,..
Examples: RVM
Ahh by the way, almost forgot..

















azet@debian:~$ cd project/
-bash: /home/azet/.rvm/scripts/initialize: No such file or directory

!
Examples: virtualenv
Basically the same story here
“virtualenv is a tool to create isolated Python environments.”

azet@debian:~/python$ virtualenv MyLittlePythonSandbox
New python executable in MyLittlePythonSandbox/bin/python
Installing setuptools, pip...done.
azet@debian:~/python$ cd MyLittlePythonSandbox/
azet@debian:~/python/MyLittlePythonSandbox$ source bin/activate
(MyLittlePythonSandbox)azet@debian:~/python/MyLittlePythonSandbox$ pip install XYZFUBAR

!

[write some code]

People tend to do this a lot and actually ship stuff in that way. So projects
end up with this huge requirements.txt files that you might have noticed
..if thats not bad development practice I’m not sure what is
bin/activate is actually a lot cleaner (~15 LoC Bash) than the RVM way
Examples: virtualenv
It’s a pain installing, using, maintaining and upgrading projects that someone has
prepared using virtualenv in a production environment
Often Webprojects use it, which means that your HTTP(S) daemon needs to be aware of

virtualenv and switch to the directory and source stuff to get things working.. m(
From a good recent blog post* on why you should not do it that way: 


















* http://pythonrants.wordpress.com/2013/12/06/why-i-hate-virtualenv-and-pip/
Handling IPhyton with Modules
devbox$ module display ipython/0.13.2-Python-2.7.3

!

whatis("The IPython project provides an enhanced interactive environment that
includes, among other features, support for data visualization and facilities for
distributed and parallel computation. - Homepage: http://ipython.org/index.html”)

!

conflict("ipython")

!

load("Python/2.7.3")

!

prepend_path("LD_LIBRARY_PATH","/software/ipython/0.13.2-Python-2.7.3/lib")
prepend_path("MANPATH","/software/ipython/0.13.2-Python-2.7.3/share/man")
prepend_path(“PATH","/software/ipython/0.13.2-Python-2.7.3/bin")

!

prepend_path(“PYTHONPATH","/software/ipython/0.13.2-Python-2.7.3/lib/python2.7/
site-packages")

!

help([[
The IPython project provides an enhanced interactive environment that
includes, among other features, support for data visualization and facilities for
distributed and parallel computation. - Homepage: http://ipython.org/index.html

!

]])

!

devbox$ module load ipython/0.13.2-Python-2.7.3
devbox$ ipython —version
0.13.2
devbox$
What if I tell you that..
You can do all this things quite easily with modules
Save time & effort maintaining stuff
Have reproducibility
..and more fun & time to concentrate on that is important
developing good software

?
..but modules does not install stuff for me I take it?
Back in the 1970ies at Bell Labs Ken Thompson put forward a small set of radical
ideas for software engineering that are often ignored by the FOSS community
today (who shouted systemd?), those have been summarised by Doug Mcllroy of
Bell Labs as:



“Write programs that do one thing and do it well. Write programs to work together.
Write programs to handle text streams, because that is a universal interface.”
..but modules does not install stuff for me I take it?
Back in the 1970ies at Bell Labs Ken Thompson put forward a small set of radical
ideas for software engineering that are often ignored by the FOSS community
today (who shouted systemd?), those have been summarised by Doug Mcllroy of
Bell Labs as:



“Write programs that do one thing and do it well. Write programs to work together.
Write programs to handle text streams, because that is a universal interface.”
There are a lot of different ways to install binary or source distributions of
software.
They are all compatible with the idea of environment modules.
For an excellent approach that fits HPC/comp.sci. sites well talk to the EasyBuild
guys (the adjacent talk will introduce you to their concept).
EasyBuild not only does optimised builds but outputs modulefiles as well!
Thank you for your time!

E-Mail: azet@azet.org
XMPP/Jabber: azet@jabber.ccc.de
Twitter: @a_z_e_t
GitHub: azet
GPG Fingerprint: 0xFDB9B5D5

More Related Content

What's hot

Linux internals v4
Linux internals v4Linux internals v4
Linux internals v4
Liran Ben Haim
 
Building Embedded Linux Systems Introduction
Building Embedded Linux Systems IntroductionBuilding Embedded Linux Systems Introduction
Building Embedded Linux Systems Introduction
Sherif Mousa
 
Yocto Project Kernel Lab hands-on
Yocto Project Kernel Lab hands-onYocto Project Kernel Lab hands-on
Yocto Project Kernel Lab hands-on
Trevor Woerner
 
Embedded Linux from Scratch to Yocto
Embedded Linux from Scratch to YoctoEmbedded Linux from Scratch to Yocto
Embedded Linux from Scratch to YoctoSherif Mousa
 
Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)
Thomas Petazzoni
 
Embedded linux system development (slides)
Embedded linux system development (slides)Embedded linux system development (slides)
Embedded linux system development (slides)
Jaime Barragan
 
Unix v6 Internals
Unix v6 InternalsUnix v6 Internals
Introduction to Embedded Linux
Introduction to Embedded LinuxIntroduction to Embedded Linux
Introduction to Embedded Linux
Hossain Reja
 
Linux device driver
Linux device driverLinux device driver
Linux device driver
chatsiri
 
Hints for L4 Microkernel
Hints for L4 MicrokernelHints for L4 Microkernel
Hints for L4 Microkernel
National Cheng Kung University
 
Fuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FSFuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FS
Chetan Giridhar
 
olibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linuxolibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linux
National Cheng Kung University
 

What's hot (14)

Linux internals v4
Linux internals v4Linux internals v4
Linux internals v4
 
Building Embedded Linux Systems Introduction
Building Embedded Linux Systems IntroductionBuilding Embedded Linux Systems Introduction
Building Embedded Linux Systems Introduction
 
Yocto Project Kernel Lab hands-on
Yocto Project Kernel Lab hands-onYocto Project Kernel Lab hands-on
Yocto Project Kernel Lab hands-on
 
Embedded Linux from Scratch to Yocto
Embedded Linux from Scratch to YoctoEmbedded Linux from Scratch to Yocto
Embedded Linux from Scratch to Yocto
 
Embedded Linux On A R M
Embedded  Linux On  A R MEmbedded  Linux On  A R M
Embedded Linux On A R M
 
Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)
 
Embedded linux system development (slides)
Embedded linux system development (slides)Embedded linux system development (slides)
Embedded linux system development (slides)
 
Unix v6 Internals
Unix v6 InternalsUnix v6 Internals
Unix v6 Internals
 
Introduction to Embedded Linux
Introduction to Embedded LinuxIntroduction to Embedded Linux
Introduction to Embedded Linux
 
Basic Linux Internals
Basic Linux InternalsBasic Linux Internals
Basic Linux Internals
 
Linux device driver
Linux device driverLinux device driver
Linux device driver
 
Hints for L4 Microkernel
Hints for L4 MicrokernelHints for L4 Microkernel
Hints for L4 Microkernel
 
Fuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FSFuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FS
 
olibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linuxolibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linux
 

Viewers also liked

Banking ppt
Banking pptBanking ppt
Banking ppt
J. Sen
 
Save environment , save life
Save environment , save lifeSave environment , save life
Save environment , save life
Vivek Rathi
 
Unit 01business environment pdf
Unit 01business environment pdfUnit 01business environment pdf
Unit 01business environment pdf
J. Sen
 
Warning signs of a heart attack
Warning signs of a heart attackWarning signs of a heart attack
Warning signs of a heart attack
Victor Go
 
50 things we can do to save our environment
50 things we can do to save our environment50 things we can do to save our environment
50 things we can do to save our environment
Roi Fernandez
 
Group 6 dissolved oxygen determination ppt
Group 6 dissolved oxygen determination pptGroup 6 dissolved oxygen determination ppt
Group 6 dissolved oxygen determination pptApril Marcelino
 
Project oxygen ppt
Project oxygen pptProject oxygen ppt
Project oxygen ppt
Gorla Sindhura Sindhura
 
Save Environment and Control Pollution
Save Environment and Control PollutionSave Environment and Control Pollution
Save Environment and Control Pollution
Gourav Upadhayay
 
Save Environment PPT
Save Environment PPTSave Environment PPT
Save Environment PPT
VikrantPatankar
 
The evolution of mobile phones
The evolution of mobile phonesThe evolution of mobile phones
The evolution of mobile phones
Olivia2590
 
Operating Systems - File Management
Operating Systems -  File ManagementOperating Systems -  File Management
Operating Systems - File Management
Damian T. Gordon
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
Leslie Samuel
 

Viewers also liked (14)

Banking ppt
Banking pptBanking ppt
Banking ppt
 
Save environment , save life
Save environment , save lifeSave environment , save life
Save environment , save life
 
Rahul
RahulRahul
Rahul
 
Unit 01business environment pdf
Unit 01business environment pdfUnit 01business environment pdf
Unit 01business environment pdf
 
Healthy Heart for a long happy life
Healthy Heartfor a long happy lifeHealthy Heartfor a long happy life
Healthy Heart for a long happy life
 
Warning signs of a heart attack
Warning signs of a heart attackWarning signs of a heart attack
Warning signs of a heart attack
 
50 things we can do to save our environment
50 things we can do to save our environment50 things we can do to save our environment
50 things we can do to save our environment
 
Group 6 dissolved oxygen determination ppt
Group 6 dissolved oxygen determination pptGroup 6 dissolved oxygen determination ppt
Group 6 dissolved oxygen determination ppt
 
Project oxygen ppt
Project oxygen pptProject oxygen ppt
Project oxygen ppt
 
Save Environment and Control Pollution
Save Environment and Control PollutionSave Environment and Control Pollution
Save Environment and Control Pollution
 
Save Environment PPT
Save Environment PPTSave Environment PPT
Save Environment PPT
 
The evolution of mobile phones
The evolution of mobile phonesThe evolution of mobile phones
The evolution of mobile phones
 
Operating Systems - File Management
Operating Systems -  File ManagementOperating Systems -  File Management
Operating Systems - File Management
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Similar to How to save the environment

Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1
inside-BigData.com
 
Android memory analysis Debug slides.pdf
Android memory analysis Debug slides.pdfAndroid memory analysis Debug slides.pdf
Android memory analysis Debug slides.pdf
VishalKumarJha10
 
Shorten Device Boot Time for Automotive IVI and Navigation Systems
Shorten Device Boot Time for Automotive IVI and Navigation SystemsShorten Device Boot Time for Automotive IVI and Navigation Systems
Shorten Device Boot Time for Automotive IVI and Navigation Systems
National Cheng Kung University
 
brief intro to Linux device drivers
brief intro to Linux device driversbrief intro to Linux device drivers
brief intro to Linux device drivers
Alexandre Moreno
 
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B KuteUnit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Tushar B Kute
 
510Lec01-Overview.pptx
510Lec01-Overview.pptx510Lec01-Overview.pptx
510Lec01-Overview.pptx
KrosumLabs1
 
Some wonderful Linux softwares for daily use
Some wonderful Linux softwares for daily useSome wonderful Linux softwares for daily use
Some wonderful Linux softwares for daily use
arun.arwachin
 
Revolutionizing the cloud with container virtualization
Revolutionizing the cloud with container virtualizationRevolutionizing the cloud with container virtualization
Revolutionizing the cloud with container virtualizationWSO2
 
Kernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using BuildrootKernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using Buildroot
Anne Nicolas
 
Autotools
AutotoolsAutotools
Autotools
Thierry Gayet
 
Core Android
Core AndroidCore Android
Core Android
Dominik Helleberg
 
Evolution of Linux Containerization
Evolution of Linux Containerization Evolution of Linux Containerization
Evolution of Linux Containerization
WSO2
 
Evoluation of Linux Container Virtualization
Evoluation of Linux Container VirtualizationEvoluation of Linux Container Virtualization
Evoluation of Linux Container Virtualization
Imesh Gunaratne
 
Shared Object images in Docker: What you need is what you want.
Shared Object images in Docker: What you need is what you want.Shared Object images in Docker: What you need is what you want.
Shared Object images in Docker: What you need is what you want.
Workhorse Computing
 
First steps on CentOs7
First steps on CentOs7First steps on CentOs7
First steps on CentOs7
Marc Cortinas Val
 

Similar to How to save the environment (20)

Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1
 
Android memory analysis Debug slides.pdf
Android memory analysis Debug slides.pdfAndroid memory analysis Debug slides.pdf
Android memory analysis Debug slides.pdf
 
Shorten Device Boot Time for Automotive IVI and Navigation Systems
Shorten Device Boot Time for Automotive IVI and Navigation SystemsShorten Device Boot Time for Automotive IVI and Navigation Systems
Shorten Device Boot Time for Automotive IVI and Navigation Systems
 
brief intro to Linux device drivers
brief intro to Linux device driversbrief intro to Linux device drivers
brief intro to Linux device drivers
 
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B KuteUnit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
 
510Lec01-Overview.pptx
510Lec01-Overview.pptx510Lec01-Overview.pptx
510Lec01-Overview.pptx
 
Some wonderful Linux softwares for daily use
Some wonderful Linux softwares for daily useSome wonderful Linux softwares for daily use
Some wonderful Linux softwares for daily use
 
Alvaro Denis Resume
Alvaro Denis ResumeAlvaro Denis Resume
Alvaro Denis Resume
 
Studienarb linux kernel-dev
Studienarb linux kernel-devStudienarb linux kernel-dev
Studienarb linux kernel-dev
 
Revolutionizing the cloud with container virtualization
Revolutionizing the cloud with container virtualizationRevolutionizing the cloud with container virtualization
Revolutionizing the cloud with container virtualization
 
Lecture 4 Cluster Computing
Lecture 4 Cluster ComputingLecture 4 Cluster Computing
Lecture 4 Cluster Computing
 
Touch your NetBSD
Touch your NetBSDTouch your NetBSD
Touch your NetBSD
 
Kernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using BuildrootKernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using Buildroot
 
Autotools
AutotoolsAutotools
Autotools
 
Core Android
Core AndroidCore Android
Core Android
 
Evolution of Linux Containerization
Evolution of Linux Containerization Evolution of Linux Containerization
Evolution of Linux Containerization
 
Evoluation of Linux Container Virtualization
Evoluation of Linux Container VirtualizationEvoluation of Linux Container Virtualization
Evoluation of Linux Container Virtualization
 
Shared Object images in Docker: What you need is what you want.
Shared Object images in Docker: What you need is what you want.Shared Object images in Docker: What you need is what you want.
Shared Object images in Docker: What you need is what you want.
 
First steps on CentOs7
First steps on CentOs7First steps on CentOs7
First steps on CentOs7
 
Unix 3 en
Unix 3 enUnix 3 en
Unix 3 en
 

More from Aaron Zauner

Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
Aaron Zauner
 
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
Aaron Zauner
 
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
Aaron Zauner
 
State of Transport Security in the E-Mail Ecosystem at Large
State of Transport Security in the E-Mail Ecosystem at LargeState of Transport Security in the E-Mail Ecosystem at Large
State of Transport Security in the E-Mail Ecosystem at Large
Aaron Zauner
 
Javascript Object Signing & Encryption
Javascript Object Signing & EncryptionJavascript Object Signing & Encryption
Javascript Object Signing & Encryption
Aaron Zauner
 
Introduction to and survey of TLS security (BsidesHH 2014)
Introduction to and survey of TLS security (BsidesHH 2014)Introduction to and survey of TLS security (BsidesHH 2014)
Introduction to and survey of TLS security (BsidesHH 2014)Aaron Zauner
 
Beautiful Bash: Let's make reading and writing bash scripts fun again!
Beautiful Bash: Let's make reading and writing bash scripts fun again!Beautiful Bash: Let's make reading and writing bash scripts fun again!
Beautiful Bash: Let's make reading and writing bash scripts fun again!
Aaron Zauner
 
Introduction to and survey of TLS Security
Introduction to and survey of TLS SecurityIntroduction to and survey of TLS Security
Introduction to and survey of TLS SecurityAaron Zauner
 
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
Aaron Zauner
 
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014 [Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
Aaron Zauner
 
Introduction to and survey of TLS Security
Introduction to and survey of TLS SecurityIntroduction to and survey of TLS Security
Introduction to and survey of TLS Security
Aaron Zauner
 
BetterCrypto: Applied Crypto Hardening
BetterCrypto: Applied Crypto HardeningBetterCrypto: Applied Crypto Hardening
BetterCrypto: Applied Crypto Hardening
Aaron Zauner
 
Sc12 workshop-writeup
Sc12 workshop-writeupSc12 workshop-writeup
Sc12 workshop-writeup
Aaron Zauner
 

More from Aaron Zauner (13)

Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
Because "use urandom" isn't everything: a deep dive into CSPRNGs in Operating...
 
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
[BlackHat USA 2016] Nonce-Disrespecting Adversaries: Practical Forgery Attack...
 
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
No need for Black Chambers: Testing TLS in the E-Mail Ecosystem at Large (hac...
 
State of Transport Security in the E-Mail Ecosystem at Large
State of Transport Security in the E-Mail Ecosystem at LargeState of Transport Security in the E-Mail Ecosystem at Large
State of Transport Security in the E-Mail Ecosystem at Large
 
Javascript Object Signing & Encryption
Javascript Object Signing & EncryptionJavascript Object Signing & Encryption
Javascript Object Signing & Encryption
 
Introduction to and survey of TLS security (BsidesHH 2014)
Introduction to and survey of TLS security (BsidesHH 2014)Introduction to and survey of TLS security (BsidesHH 2014)
Introduction to and survey of TLS security (BsidesHH 2014)
 
Beautiful Bash: Let's make reading and writing bash scripts fun again!
Beautiful Bash: Let's make reading and writing bash scripts fun again!Beautiful Bash: Let's make reading and writing bash scripts fun again!
Beautiful Bash: Let's make reading and writing bash scripts fun again!
 
Introduction to and survey of TLS Security
Introduction to and survey of TLS SecurityIntroduction to and survey of TLS Security
Introduction to and survey of TLS Security
 
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
[IETF Part] BetterCrypto Workshop @ Hack.lu 2014
 
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014 [Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
[Attacks Part] BetterCrypto Workshop @ Hack.lu 2014
 
Introduction to and survey of TLS Security
Introduction to and survey of TLS SecurityIntroduction to and survey of TLS Security
Introduction to and survey of TLS Security
 
BetterCrypto: Applied Crypto Hardening
BetterCrypto: Applied Crypto HardeningBetterCrypto: Applied Crypto Hardening
BetterCrypto: Applied Crypto Hardening
 
Sc12 workshop-writeup
Sc12 workshop-writeupSc12 workshop-writeup
Sc12 workshop-writeup
 

Recently uploaded

Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
nkrafacyberclub
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
RinaMondal9
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
Alex Pruden
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 

Recently uploaded (20)

Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 

How to save the environment

  • 1. How to save the environment ..and get rid of virtualenv, rvm, pythonbrew, rbenv, pythonz (...) FOSDEM 2014 - Brussels, Belgium, Old World Earth, Orion–Cygnus Arm, Milky Way Aaron Zauner azet@azet.org @a_z_e_t
  • 2. `whoami` Self-employed engineer currently involved in IT-Infrastructure, HPC and security stuff primarily working for biology institutes of the austrian academy of sciences Used to do Web/Mail and Datacenter Operations Front/Backend Dev. Security auditing FOSS/Community (BSD) […]
  • 3. Slide intentionally left blank for your enjoyment.
  • 4. Text ‘Environment Modules’ First officially published at LISA V back in 1991 by John L. Furlani
  • 5. Environment Modules In use ever since in High Performance and Scientific Computing Ease of administration Ease of use
  • 6. Environment Modules by most just refered to as “Modules” originally intended to enable multiple users to have software in different versions available traditionally most HPC environments do not use system packages special compilers, toolchains, math libraries, optimisation, interconnect-specifics […] and often scientific software is not to be found in $distro repo (because it’s crap || not used outside the sci. community) somewhat like Gentoo or Arch - but a lot more cumbersome for sysadmins and users a system to manage multiple versions of the same software with different toolchains is needed that is easy to maintain and easy for users (developers and scientists, usually) to learn and use
  • 7. Environment Modules “modulefiles” dynamically set an environment specific to a software may load/unload other modulefiles if there is a dependency present examples include but are not limited to PATH MANPATH LD_LIBRARY_PATH LD_PRELOAD
  • 8. Environment Modules (with Lmod - more on that later) ! ! whatis("Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. - Homepage: http://git-scm.com/“) ! conflict("git") ! prepend_path(“LD_LIBRARY_PATH","/software/git/1.8.2/lib") prepend_path("LD_LIBRARY_PATH","/software/git/1.8.2/lib64") prepend_path(“MANPATH","/software/git/1.8.2/share/man") ! […]
  • 9. Environment Modules: Implementations http://xkcd.com/927/ Creative Commons Attribution-NonCommercial 2.5 License
  • 10. Environment Modules: Implementations “Classical Modules” (Furlani et. al.): C/Tcl still in use at arguably most HPC sites modules.sourceforge.net ! modules-tcl (Kent Mein of UMN): Tcl http://sourceforge.net/p/modules/modules-tcl Cmod (Per Cederqvist et. al.): C http://www.lysator.liu.se/cmod/ Lmod (Robert McLay of TACC): Lua https://www.tacc.utexas.edu/tacc-projects/lmod similar systems: ! SoftEnv (by and in use at Argonne National Lab): Csh http://www.mcs.anl.gov/hs/software/systems/ softenv/softenv-admin.html dotkit (by and in use at Lawrence Livermore National Lab): *Shell https://computing.llnl.gov/? set=jobs&page=dotkit
  • 11. Environment Modules: Implementations “Classical Modules” (Furlani et. al.): C/Tcl still in use at arguably most HPC sites modules.sourceforge.net ! modules-tcl (Kent Mein of UMN): Tcl http://sourceforge.net/p/modules/modules-tcl Cmod (Per Cederqvist et. al.): C http://www.lysator.liu.se/cmod/ Lmod (Robert McLay of TACC): Lua https://www.tacc.utexas.edu/tacc-projects/lmod similar systems: ! SoftEnv (by and in use at Argonne National Lab): Csh http://www.mcs.anl.gov/hs/software/systems/ softenv/softenv-admin.html dotkit (by and in use at Lawrence Livermore National Lab): *Shell https://computing.llnl.gov/? set=jobs&page=dotkit
  • 12. Modules in the 21st century: Lmod I’ll focus on Lmod from now on, though most things will work with other systems as well Very actively maintained by one of the most awesome maintainers we’ve seen in an open-source project Active community Cool new features: automatic swapping of modules, if applicable conflict detection (i.e. two compilers loaded at the same time) loading of modules with “atleast”, “between” and “latest” w.r.t software versions Spider (searching) and Keywords Caching
  • 13. Modules in the 21st century: Lmod I’ll focus on Lmod from now on, though most things will work with other systems as well Very actively maintained by one of the most awesome maintainers we’ve seen in an open-source project Active community Cool new features: Hooks (e.g. function call every time a module is loaded) tcl2lua wrapper for conversion of old module files shell script/environment to Lua wrapper GPU and Xeon Phi specifics (colors :D) […]
  • 14. Environment Modules: In Action module avail ----------------- /net/gmi.oeaw.ac.at/software/mendel/intel-x86_64-sandybridge-avx/modules/devel -----------------Autoconf/2.69-goolf-1.4.10 SCons/2.3.0-ictce-5.3.0-Python-2.7.3 (D) Automake/1.13.1-goolf-1.4.10 SWIG/2.0.4-goolf-1.4.10-Python-2.7.3 Boost/1.51.0-goolf-1.4.10-Python-2.7.3 ZeroMQ/2.2.0-goolf-1.4.10 Boost/1.51.0-goolf-1.4.10 (D) ant/1.8.4-Java-1.7.0_10 CMake/2.8.4-goolf-1.4.10 gperf/3.0.4-goolf-1.4.10 CMake/2.8.11-goolf-1.4.10 guile/1.8.8-goolf-1.4.10 CMake/2.8.12-GCC-4.7.2 (D) ncurses/5.9-GCC-4.7.2 Greenlet/0.4.1-goolf-1.4.10-Python-2.7.3 ncurses/5.9-goalf-1.1.0-no-OFED JUnit/4.10-Java-1.7.0_10 ncurses/5.9-goolf-1.4.10 LZO/2.06-goolf-1.4.10 ncurses/5.9-ictce-5.2.0 LZO/2.06-ictce-5.3.0 (D) ncurses/5.9-ictce-5.3.0 (D) M4/1.4.16-goolf-1.4.10 pkg-config/0.27.1-goolf-1.4.10 PCRE/8.12-goolf-1.4.10 setuptools/0.6c11-goolf-1.4.10-Python-2.7.3 PCRE/8.12-ictce-5.3.0 (D) setuptools/0.7.8-goolf-1.4.10-Python-2.7.3 PyZMQ/2.2.0.1-goolf-1.4.10-Python-2.7.3-zmq2 setuptools/2.0.1-goolf-1.4.10-Python-2.7.3 (D) SCons/2.3.0-goolf-1.4.10-Python-2.7.3 ! (only a small subset of the modules at this site)
  • 15. Environment Modules: In Action module load aaron.zauner@login0 [~]> python --version Python 2.6.8 aaron.zauner@login0 [~]> module load Python/2.7.3-ictce-5.3.0 aaron.zauner@login0 [~]> python --version Python 2.7.3
  • 16. Environment Modules: In Action module swap ! aaron.zauner@login0 [~]> module swap Python Python/2.7.5-goolf-1.4.10 The following have been reloaded with a version change: 1) bzip2/1.0.6-ictce-5.3.0 => bzip2/1.0.6-goolf-1.4.10 2) libreadline/6.2-ictce-5.3.0 => libreadline/6.2-goolf-1.4.10 3) ncurses/5.9-ictce-5.3.0 => ncurses/5.9-goolf-1.4.10 4) zlib/1.2.7-ictce-5.3.0 => zlib/1.2.8-goolf-1.4.10 ! aaron.zauner@login0 [~]> python --version Python 2.7.5
  • 17. Environment Modules: In Action module spider ! ! ! ! ! ! ! ! aaron.zauner@login0 [~]> module spider setuptools --------------------------------------------------------------------------------------------------------------setuptools: --------------------------------------------------------------------------------------------------------------Versions: setuptools/0.6c11-goolf-1.4.10-Python-2.7.3 setuptools/0.7.8-goolf-1.4.10-Python-2.7.3 setuptools/2.0.1-goolf-1.4.10-Python-2.7.3 --------------------------------------------------------------------------------------------------------------To find detailed information about setuptools please enter the full name. For example: $ module spider setuptools/2.0.1-goolf-1.4.10-Python-2.7.3 ---------------------------------------------------------------------------------------------------------------
  • 18. Environment Modules: In Action module list ! aaron.zauner@login0 [~]> module list Currently Loaded Modules: 1) std_env 2) gmi_term_color 3) gmi_resources 4) ictce/5.3.0 5) icc/2013.3.163 6) ifort/2013.3.163 7) impi/4.1.0.030 8) imkl/11.0.3.163 9) Python/2.7.5-goolf-1.4.10 10) goolf/1.4.10 11) GCC/4.7.2 ! ! ! ! ! 12) 13) 14) 15) 16) 17) 18) 19) 20) 21) OpenMPI/1.6.4-GCC-4.7.2 hwloc/1.6.2-GCC-4.7.2 OpenBLAS/0.2.6-gompi-1.4.10-LAPACK-3.4.2 gompi/1.4.10 FFTW/3.3.3-gompi-1.4.10 ScaLAPACK/2.0.2-gompi-1.4.10-OpenBLAS-0.2.6-LAPACK-3.4.2 bzip2/1.0.6-goolf-1.4.10 zlib/1.2.8-goolf-1.4.10 libreadline/6.2-goolf-1.4.10 ncurses/5.9-goolf-1.4.10
  • 19. Environment Modules: In Action module display ! aaron.zauner@login0 [~]> module display GCC/4.7.2 --------------------------------------------------------------------------------------------------------------/net/gmi.oeaw.ac.at/software/mendel/intel-x86_64-sandybridge-avx/modules/compiler/GCC/4.7.2: --------------------------------------------------------------------------------------------------------------whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/") conflict("GCC") prepend_path("CPATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/include") prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib") prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib64") prepend_path("LD_LIBRARY_PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/lib/gcc/x86_64unknown-linux-gnu/4.7.2") prepend_path("MANPATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/share/man") prepend_path("PATH","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/bin") setenv("EBROOTGCC","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2") setenv("EBVERSIONGCC","4.7.2") setenv("EBDEVELGCC","/net/gmi.oeaw.ac.at/software/mendel/29_04_2013/software/GCC/4.7.2/easybuild/GCC-4.7.2easybuild-devel") help([[ The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/ ! ]]) ! !
  • 20. Environment Modules: In Action ..A lot more to show but time is limited.. !
  • 21. Modules for FOSS Devs. Still largely unkown and unused in the FOSS community Could be a reasonable replacement for the vast number of language specific environment abstraction tools as in use today There’s really no reason not to use it (that I know of) I’ll demonstrate on two prominent examples
  • 22. Examples: RVM “Ruby enVironment (Version) Manager” [sic!] 20k lines of shell script, now being rewritten in Ruby basically installs and manages multiple versions of Ruby also does a couple of other cool things recently did a fundraiser for 50k USD to do the rewrite to Ruby actually has corporate sponsoring Sorry to say this: I develop Ruby code and It’s a bloated piece of shit that fucks up your environment beyond repair. Won’t ever use it again, ever. ever. Of course web developers love the hell out of it
  • 23. Examples: RVM rvm install ruby-2 installs Ruby2 from source, downloads dependencies. wow. such magic. many hax. much sophisticate rvm list rvm use ruby-2 rvm use 1.9.2 —default does any of that sound familiar? right.
  • 24. Examples: RVM azet@debian:~$ rvm use ruby-2 Using /home/azet/.rvm/gems/ruby-2.1.0 azet@debian:~$ set -v; rvm use system &>gimmethepain azet@debian:~$ wc -l gimmethepain 6458 gimmethepain azet@debian:~$ ! Yes. It takes ~6.5k lines of bash code to switch the Ruby version in the current environment with RVM.
  • 25. “Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.”
  • 26. Examples: RVM Environmental pollution fact: RVM screws with `cd`. azet@debian:~$ set -x azet@debian:~$ cd ~ + cd /home/azet + builtin cd /home/azet + [[ -n '' ]] + true + __rvm_cd_functions_set + __rvm_do_with_env_before + [[ -n '' ]] + [[ -n /home/azet/.rvm ]] + source /home/azet/.rvm/scripts/initialize ++ : rvm_trace_flag:0 ++ (( rvm_trace_flag > 0 )) ++ [[ -n 4.2.45(1)-release ]] ++ shopt -s extglob ++ export __rvm_env_loaded ++ : __rvm_env_loaded:0: ++ : __rvm_env_loaded:1: ++ [[ -z '' ]] ++ typeset -f __rvm_cleanse_variables ++ __rvm_cleanse_variables ++ __rvm_unset_ruby_variables ++ unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag ++ __rvm_load_rvmrc ++ typeset _file ++ typeset -a rvm_rvmrc_files ++ (( 0 == 1 )) ..this goes on for another 148 lines of executed bullshit. 170 total 
 for every `cd` you type after installing RVM. yup. isn’t that great?
  • 27. Examples: RVM Environmental pollution fact: RVM screws with `cd`. azet@debian:~$ set -x azet@debian:~$ cd ~ + cd /home/azet + builtin cd /home/azet + [[ -n '' ]] + true + __rvm_cd_functions_set + __rvm_do_with_env_before + [[ -n '' ]] + [[ -n /home/azet/.rvm ]] + source /home/azet/.rvm/scripts/initialize ++ : rvm_trace_flag:0 ++ (( rvm_trace_flag > 0 )) ++ [[ -n 4.2.45(1)-release ]] ++ shopt -s extglob ++ export __rvm_env_loaded ++ : __rvm_env_loaded:0: ++ : __rvm_env_loaded:1: ++ [[ -z '' ]] ++ typeset -f __rvm_cleanse_variables ++ __rvm_cleanse_variables ++ __rvm_unset_ruby_variables ++ unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag ++ __rvm_load_rvmrc ++ typeset _file ++ typeset -a rvm_rvmrc_files ++ (( 0 == 1 )) ..this goes on for another 148 lines of executed bullshit. 170 total 
 for every `cd` you type after installing RVM. yup. isn’t that great?
  • 28. Examples: RVM azet@debian:~$ time cd ! real 0m0.009s user 0m0.004s sys 0m0.004s azet@debian:~$ rvm implode […] azet@debian:~$ time cd ! real 0m0.000s user 0m0.000s sys 0m0.000s ! ..if you really do not like modules, please use rbenv instead
 a lot more to tell about RVM but lets move on,..
  • 29. Examples: RVM Ahh by the way, almost forgot..
 
 
 
 
 
 
 
 
 azet@debian:~$ cd project/ -bash: /home/azet/.rvm/scripts/initialize: No such file or directory !
  • 30. Examples: virtualenv Basically the same story here “virtualenv is a tool to create isolated Python environments.”
 azet@debian:~/python$ virtualenv MyLittlePythonSandbox New python executable in MyLittlePythonSandbox/bin/python Installing setuptools, pip...done. azet@debian:~/python$ cd MyLittlePythonSandbox/ azet@debian:~/python/MyLittlePythonSandbox$ source bin/activate (MyLittlePythonSandbox)azet@debian:~/python/MyLittlePythonSandbox$ pip install XYZFUBAR ! [write some code] People tend to do this a lot and actually ship stuff in that way. So projects end up with this huge requirements.txt files that you might have noticed ..if thats not bad development practice I’m not sure what is bin/activate is actually a lot cleaner (~15 LoC Bash) than the RVM way
  • 31. Examples: virtualenv It’s a pain installing, using, maintaining and upgrading projects that someone has prepared using virtualenv in a production environment Often Webprojects use it, which means that your HTTP(S) daemon needs to be aware of
 virtualenv and switch to the directory and source stuff to get things working.. m( From a good recent blog post* on why you should not do it that way: 
 
 
 
 
 
 
 
 
 * http://pythonrants.wordpress.com/2013/12/06/why-i-hate-virtualenv-and-pip/
  • 32. Handling IPhyton with Modules devbox$ module display ipython/0.13.2-Python-2.7.3 ! whatis("The IPython project provides an enhanced interactive environment that includes, among other features, support for data visualization and facilities for distributed and parallel computation. - Homepage: http://ipython.org/index.html”) ! conflict("ipython") ! load("Python/2.7.3") ! prepend_path("LD_LIBRARY_PATH","/software/ipython/0.13.2-Python-2.7.3/lib") prepend_path("MANPATH","/software/ipython/0.13.2-Python-2.7.3/share/man") prepend_path(“PATH","/software/ipython/0.13.2-Python-2.7.3/bin") ! prepend_path(“PYTHONPATH","/software/ipython/0.13.2-Python-2.7.3/lib/python2.7/ site-packages") ! help([[ The IPython project provides an enhanced interactive environment that includes, among other features, support for data visualization and facilities for distributed and parallel computation. - Homepage: http://ipython.org/index.html ! ]]) ! devbox$ module load ipython/0.13.2-Python-2.7.3 devbox$ ipython —version 0.13.2 devbox$
  • 33. What if I tell you that.. You can do all this things quite easily with modules Save time & effort maintaining stuff Have reproducibility ..and more fun & time to concentrate on that is important developing good software ?
  • 34. ..but modules does not install stuff for me I take it? Back in the 1970ies at Bell Labs Ken Thompson put forward a small set of radical ideas for software engineering that are often ignored by the FOSS community today (who shouted systemd?), those have been summarised by Doug Mcllroy of Bell Labs as:
 
 “Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.”
  • 35. ..but modules does not install stuff for me I take it? Back in the 1970ies at Bell Labs Ken Thompson put forward a small set of radical ideas for software engineering that are often ignored by the FOSS community today (who shouted systemd?), those have been summarised by Doug Mcllroy of Bell Labs as:
 
 “Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.” There are a lot of different ways to install binary or source distributions of software. They are all compatible with the idea of environment modules. For an excellent approach that fits HPC/comp.sci. sites well talk to the EasyBuild guys (the adjacent talk will introduce you to their concept). EasyBuild not only does optimised builds but outputs modulefiles as well!
  • 36. Thank you for your time! E-Mail: azet@azet.org XMPP/Jabber: azet@jabber.ccc.de Twitter: @a_z_e_t GitHub: azet GPG Fingerprint: 0xFDB9B5D5