SlideShare a Scribd company logo
1 of 88
Download to read offline
The Age of
Incompatible
  Expensive
  Machines
selling hardware
1968

hardware      software
FORTRAN
          COBOL
 Algol
#!/usr/bin/perl                                                                                                                                                                           foreach (@pkglines) {
#                                                                                        close REASON or                                                                                      chomp;
# This program is free software; you can redistribute it and/or modify                die "Can't close FILE [$file]: $!n";                                                                   $linenbr++;
# it under the terms of the GNU General Public License as published by                }                                                                                                       if (/^Package:/) {
# the Free Software Foundation; either version 2 of the License, or                                                                                                                       ($label, $pkg) = split(/:s+/,$_,2);
# (at your option) any later version.                                                 #                                                                                                   $pkgcnt++;
#                                                                                     # Main program starts here.                                                                         printf "pkg(%4.4d) pkg=[%s]n",$pkgcnt,$pkg if $debug >= 1;
# This program is distributed in the hope that it will be useful,                     #                                                                                                   $has_pkg = 1;                    ### we have necessary section
# but WITHOUT ANY WARRANTY; without even the implied warranty of                      GetOptions('q|quiet' => $quiet,                                                                    next;
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                          's|sparse' => $sparse,                                                                               }
# GNU General Public License for more details.                                          'e|explain!' => $explain,                                                                            if (/^Status:/) {
#                                                                                       'reason-dir=s' => $reasondir,                                                                    my $label = "";
                                                                                        'd|debug+' => $debug,                                                                            ($label, $pkgstatus) = split(/:s+/,$_,2);
use strict;                                                                             'h|help' => $help);                                                                              print "tpkgstatus=[$pkgstatus]n" if $debug >= 1;
use warnings;                                                                                                                                                                             $pkg_status{$pkg} = $pkgstatus;
                                                                                      if ($help) {                                                                                        ($plan, $state, $status) = split(/s+/,$pkgstatus);
use Getopt::Long;                                                                         usage();                                                                                        print "ttplan=[$plan]n" if $debug >= 1;
                                                                                          exit 0;                                                                                         print "ttstate=[$state]n" if $debug >= 1;
# Declaration of important/main variables.                                            }                                                                                                   print "ttstatus=[$status]n" if $debug >= 1;
my $quiet = 0;                                                                                                                                                                            $has_status = 1;                 ### we have necessary section
my $sparse = 0;                                                                       opendir(REASONDIR, $reasondir) or                                                                   next;
my $help = 0;                                                                            die "Can't open DIR [$reasondir]: $!n";                                                             }
my $explain = 1;                                                                      # Parse all the reason files in $reasondir except those beginning with                                  if (/^Section:/) {
my $debug = 0;                                                                        # a . or ending with a ~                                                                            my $label = "";
my $reasondir = '/usr/share/vrms/reasons/';                                           parse_reason_file("$reasondir/$_")                                                                  ($label, $section) = split(/:s+/,$_,2);
my %reason = ();                                                                         foreach (grep {!/~$/ && !/^./} readdir(REASONDIR));                                             print "tsection=[$section]n" if $debug >= 1;
                                                                                      closedir REASONDIR or                                                                               $has_section = 1;                ### we have necessary section
#                                                                                        die "Can't close DIR [$reasondir]: $!n";                                                        if ($section =~ /contrib|non-free|restricted|multiverse/) {
# Auxiliary functions section (FIXME: put them in a file by themselves).                                                                                                                      ### read thru rest of array to find descr instead of waiting for it




                                                                             source code
#                                                                                     my $statusfile = '/var/lib/dpkg/status';                                                                my $found_descr =0;
                                                                                      my $is_nonfree = 0;                      ### preset none found, yet                                     while (! $found_descr) {
# sub usage:                                                                          my %nonfree = ();                                                                                   if ($linenbr > $#pkglines) {
# Input: nothing.                                                                     my $is_other_nonfree = 0; ### preset none found, yet                                                    ### iff badly formed entry ensure blank description
# Output: Messages to stdout telling the usage of the program.                        my %other_nonfree = ();                                                                                 print "tEEEE shortdescr=[$shortdescr]n" if $debug >= 1;
sub usage() {                                                                         my $is_contrib = 0;                      ### preset none found, yet                                     last;
   print <<EOF;                                                                       my %contrib = ();                                                                                   }
Usage: vrms [OPTIONS] ...                                                             my $is_other_contrib = 0; ### preset none found, yet                                                my $dline = $pkglines[$linenbr++];
                                                                                      my %other_contrib = ();                                                                             if($dline =~ /^Description:/) {
--quiet, -q                 Do nothing if there are no non-free packages installed.   my %pkg_status = ();                                                                                    ($label, $shortdescr) = split(/:s+/,$dline,2);
--explain, -e               Give a brief explanation of why a package is non-free,    my $pkgcnt = 0;                                                                                         print "tshortdescr=[$shortdescr]n" if $debug >= 1;
  if available.                                                                       my $clumpcnt = 0;                                                                                       $found_descr = 1;
--sparse, -s                Just list non-free packages, nothing else.                my $dontcarelines = 5;                   ### no. of lines a non-installed entry may have in the     }
--reason-dir=DIR            Use DIR as the reason directory.                          statusfile                                                                                              }
--help, -h                  Display this help.                                                                                                                                                if ($section =~ /contrib/) {
--debug, -d                 Generate debugging information.                                                                                                                               if (lc $status eq 'installed') {
                                                                                      my $sysname = "";                                                                                       $is_contrib = 1;
All options can be prefixed with "no" (eg: --noexplain) to turn them off.             chop($sysname = `uname -n`);                                                                            $contrib{$pkg} = $shortdescr;
EOF                                                                                                                                                                                       } else {
}                                                                                     open(PKG_SOURCE, "< $statusfile") or                                                                    $is_other_contrib = 1;
                                                                                        die "Can't open FILE [$statusfile]: $!n";                                                            $other_contrib{$pkg} = $shortdescr;
# sub parse_reason_file:                                                                                                                                                                  }
# Input: the name of a reason file and the global hash %reason                        $/ = ""; ### snarf a paragraph at a time                                                                } else {
# Output: the hash %reason filled with reasons from the input file                    while(<PKG_SOURCE>) {                                                                               if (lc $status eq 'installed') {
# (FIXME: %reason shouldn't be global)                                                   my $clump = $_;                                                                                      $is_nonfree = 1;
sub parse_reason_file {                                                                  $clumpcnt++;                                                                                         $nonfree{$pkg} = $shortdescr;
   my $file = shift;                                                                     my (@pkglines) = split(/n/, $clump);                                                            } else {
   print "Parsing reason file $filen" if $debug >= 1;                                   ### iff more than $dontcarelines lines, package is installed, so process it                          $is_other_nonfree = 1;
   open(REASON, "<", $file) or                                                           ### (speed-up by skipping don't-care entries)                                                        $other_nonfree{$pkg} = $shortdescr;
die "Can't open FILE [$file]: $!n";                                                     if (@pkglines > $dontcarelines) {                                                                }
                                                                                      my $pkg = "";               ### name of this package                                                    }
   while (my $line = <REASON>) {                                                      my $pkgstatus = "";         ### status                                                              }
chomp $line;                                                                          my $plan = "";                           ### install plan (hold, deinstall, purge, install, etc.)   last;             ### this is last desriptor of package we care about so end loop
# Grab a line of the form 'package: reason', skip if we don't match                   my $state = "";                          ### state (ok or ???)                                          } else {
my ($pkg, $reason) = ($line =~ /^(S+):s+(.*)s*$/) or next;                         my $status = "";            ### status (installed, not-installed, etc.)                             ### un-processed lines from package info
print "'$pkg' because '$reason'n" if ($debug >= 1);                                  my $section = "";           ### section this is where non-free is marked                            if($debug >= 1) {
                                                                                      my $shortdescr = "";        ### one-liner description of pkg                                            print "tt--- $_n";
# If this is _our_ master file, then prefer anything                                  my $linenbr = 0;            ### current line number of this pkackag's info                          }
# else (so that package maintainers can override)                                     my $label = "";                          ### junk field (not used, except to catch split values)        }
next if exists $reason{$pkg} and $file =~ //vrms$/;                                  my $has_pkg = 0;            ### reset the markers                                                   }
                                                                                      my $has_status = 0;                                                                                 if (!$has_status or !$has_pkg) {
$reason{$pkg} = $reason;                                                              my $has_section = 0;                                                                                    print STDERR "vrms: ERROR- Badly formed dpkg-status entry #$clumpcnt!n";
  }                                                                                                                                                                                           print STDERR "              pkg=[$pkg], pkgstatus=[$pkgstatus], section=[$section] n";
                                                                                                                                                                                          }
The Birth of
  UNIX
UNIX.zip

UNIX-source.zip
trade secret
most widely and
 deeply understood
trade secret
   in the history
   of computing
sharing
       innovations
          &
    bug fixes
The Birth of
Proprietary
 Software
1980
proprietary
 software
sharing
shareware
The Rise of
Free Software
1984
Free Software
Free as in speech
Free as in freedom
Free as in beer
1. use
2. copy
3. modify
4. contribute
1989, 1991

  GPL
you must extend the
same freedoms
     to others
copyleft
permissive
 licenses
you give complete
   freedom to
 developers
1993
1995
2000



$1,000,000,000
Free Software
  Becomes
 Mainstream
1998
Open Source
is Everywhere
all software
2005–2007
Software
Freedom as
Inspiration
open data
open access
Questions?

francois@catalyst.net.nz

   @fmarier
Photo credits:

ibm 360 with people: http://www.flickr.com/photos/cote/54408562/sizes/l/in/photostream/
cdc6600: https://secure.wikimedia.org/wikipedia/en/wiki/File:Personable_Computer.jpg
ken and dennis with medals: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Medal_lg.jpeg
warrington logo: http://wikieducator.org/File:Warrington_logo.png
ashs logo: http://wikieducator.org/File:ASHS_logo.png
wanted poster: http://www.flickr.com/photos/mscaprikell/59580038/in/photostream/
tape: http://www.flickr.com/photos/leejordan/486911915/
tim o'reilly: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Tim_O%27Reilly_in_Foo_China_200
fsf logo: https://secure.wikimedia.org/wikipedia/en/wiki/File:FSF-Logo.svg
tux: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Tux.svg
open source: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Opensource.svg
stock market: http://www.flickr.com/photos/thewalkingirony/3051500551/
android logo: https://secure.wikimedia.org/wikipedia/en/wiki/File:Android_logo.svg
in-flight entertainment: http://www.flickr.com/photos/kalleboo/2473197800/
samsung tv: http://www.flickr.com/photos/johannesfreund/2320330661/
Linus: http://en.wikipedia.org/wiki/File:Linus_Torvalds.jpeg
Bill Gates: http://en.wikipedia.org/wiki/File:Bill_Gates_in_WEF_,2007.jpg
Bruce Perens: [not CC] http://perens.com/press/photos/
Lawrence Lessig: http://en.wikipedia.org/wiki/File:Lessig_portrait.jpg
Jimmy Wales: http://en.wikipedia.org/wiki/File:Jimmy_Wales_Fundraiser_Appeal_edit.jpg
Steve Ballmer: http://en.wikipedia.org/wiki/File:Steve_ballmer_2007_outdoors2.jpg
us department of justice: https://secure.wikimedia.org/wikipedia/en/wiki/File:US-DeptOfJustice-Seal.svg

More Related Content

What's hot

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console componentHugo Hamon
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksNate Abele
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in actionJace Ju
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteLeonardo Proietti
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
PERL for QA - Important Commands and applications
PERL for QA - Important Commands and applicationsPERL for QA - Important Commands and applications
PERL for QA - Important Commands and applicationsSunil Kumar Gunasekaran
 
The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010Fabien Potencier
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkG Woo
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome TownRoss Tuck
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016Kacper Gunia
 

What's hot (20)

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
Shell.php
Shell.phpShell.php
Shell.php
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console component
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in action
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
PhpBB meets Symfony2
PhpBB meets Symfony2PhpBB meets Symfony2
PhpBB meets Symfony2
 
PERL for QA - Important Commands and applications
PERL for QA - Important Commands and applicationsPERL for QA - Important Commands and applications
PERL for QA - Important Commands and applications
 
The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php framework
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
Php Enums
Php EnumsPhp Enums
Php Enums
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
 

Viewers also liked

Open Source Software - A Guide to Innovation
Open Source Software - A Guide to InnovationOpen Source Software - A Guide to Innovation
Open Source Software - A Guide to InnovationKonstantyn Spasokukotskiy
 
1 rapid prototyping model
1 rapid prototyping model1 rapid prototyping model
1 rapid prototyping modeldelaco
 
Copyright in Software and Open Source licensing
Copyright in Software and Open Source licensingCopyright in Software and Open Source licensing
Copyright in Software and Open Source licensingRowan Wilson
 
Transmedia Storytelling and Digital Advertising
Transmedia Storytelling and Digital AdvertisingTransmedia Storytelling and Digital Advertising
Transmedia Storytelling and Digital AdvertisingPaperCliQ Comunicação
 
Free and open source software
Free and open source softwareFree and open source software
Free and open source softwareFrederik Questier
 
10 Reasons To Use Open Source Software-Defined Networking
10 Reasons To Use Open Source Software-Defined Networking10 Reasons To Use Open Source Software-Defined Networking
10 Reasons To Use Open Source Software-Defined NetworkingVala Afshar
 
Open source software vs proprietary software
Open source software vs proprietary softwareOpen source software vs proprietary software
Open source software vs proprietary softwareLavan1997
 
OPEN SOURCE SEMINAR PRESENTATION
OPEN SOURCE SEMINAR PRESENTATIONOPEN SOURCE SEMINAR PRESENTATION
OPEN SOURCE SEMINAR PRESENTATIONRitwick Halder
 
Vulnerability analysis in multics
Vulnerability analysis in multicsVulnerability analysis in multics
Vulnerability analysis in multicssreeja_16
 

Viewers also liked (9)

Open Source Software - A Guide to Innovation
Open Source Software - A Guide to InnovationOpen Source Software - A Guide to Innovation
Open Source Software - A Guide to Innovation
 
1 rapid prototyping model
1 rapid prototyping model1 rapid prototyping model
1 rapid prototyping model
 
Copyright in Software and Open Source licensing
Copyright in Software and Open Source licensingCopyright in Software and Open Source licensing
Copyright in Software and Open Source licensing
 
Transmedia Storytelling and Digital Advertising
Transmedia Storytelling and Digital AdvertisingTransmedia Storytelling and Digital Advertising
Transmedia Storytelling and Digital Advertising
 
Free and open source software
Free and open source softwareFree and open source software
Free and open source software
 
10 Reasons To Use Open Source Software-Defined Networking
10 Reasons To Use Open Source Software-Defined Networking10 Reasons To Use Open Source Software-Defined Networking
10 Reasons To Use Open Source Software-Defined Networking
 
Open source software vs proprietary software
Open source software vs proprietary softwareOpen source software vs proprietary software
Open source software vs proprietary software
 
OPEN SOURCE SEMINAR PRESENTATION
OPEN SOURCE SEMINAR PRESENTATIONOPEN SOURCE SEMINAR PRESENTATION
OPEN SOURCE SEMINAR PRESENTATION
 
Vulnerability analysis in multics
Vulnerability analysis in multicsVulnerability analysis in multics
Vulnerability analysis in multics
 

Similar to 35 Years of Open Source Software

Object::Franger: Wear a Raincoat in your Code
Object::Franger: Wear a Raincoat in your CodeObject::Franger: Wear a Raincoat in your Code
Object::Franger: Wear a Raincoat in your CodeWorkhorse Computing
 
Perl Intro 7 Subroutines
Perl Intro 7 SubroutinesPerl Intro 7 Subroutines
Perl Intro 7 SubroutinesShaun Griffith
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongersbrian d foy
 
Perl from the ground up: objects and testing
Perl from the ground up: objects and testingPerl from the ground up: objects and testing
Perl from the ground up: objects and testingShmuel Fomberg
 
Utility Modules That You Should Know About
Utility Modules That You Should Know AboutUtility Modules That You Should Know About
Utility Modules That You Should Know Aboutjoshua.mcadams
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationWorkhorse Computing
 
Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本Lingfei Kong
 
Introduction to Moose
Introduction to MooseIntroduction to Moose
Introduction to Moosethashaa
 
Object Oriented Programming with PHP 5 - More OOP
Object Oriented Programming with PHP 5 - More OOPObject Oriented Programming with PHP 5 - More OOP
Object Oriented Programming with PHP 5 - More OOPWildan Maulana
 
Drush Productivity FTW - DUG @ Krimson
Drush Productivity FTW - DUG @ KrimsonDrush Productivity FTW - DUG @ Krimson
Drush Productivity FTW - DUG @ KrimsonKristof Van Roy
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl styleBo Hua Yang
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In PerlKang-min Liu
 

Similar to 35 Years of Open Source Software (20)

Bag of tricks
Bag of tricksBag of tricks
Bag of tricks
 
Object::Franger: Wear a Raincoat in your Code
Object::Franger: Wear a Raincoat in your CodeObject::Franger: Wear a Raincoat in your Code
Object::Franger: Wear a Raincoat in your Code
 
Lecture19-20
Lecture19-20Lecture19-20
Lecture19-20
 
Lecture19-20
Lecture19-20Lecture19-20
Lecture19-20
 
Perl Intro 7 Subroutines
Perl Intro 7 SubroutinesPerl Intro 7 Subroutines
Perl Intro 7 Subroutines
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
 
Perl from the ground up: objects and testing
Perl from the ground up: objects and testingPerl from the ground up: objects and testing
Perl from the ground up: objects and testing
 
Subroutines
SubroutinesSubroutines
Subroutines
 
PHP Tips & Tricks
PHP Tips & TricksPHP Tips & Tricks
PHP Tips & Tricks
 
Utility Modules That You Should Know About
Utility Modules That You Should Know AboutUtility Modules That You Should Know About
Utility Modules That You Should Know About
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command Interpolation
 
My shell
My shellMy shell
My shell
 
Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本
 
Introduction to Moose
Introduction to MooseIntroduction to Moose
Introduction to Moose
 
Object Oriented Programming with PHP 5 - More OOP
Object Oriented Programming with PHP 5 - More OOPObject Oriented Programming with PHP 5 - More OOP
Object Oriented Programming with PHP 5 - More OOP
 
Drush Productivity FTW - DUG @ Krimson
Drush Productivity FTW - DUG @ KrimsonDrush Productivity FTW - DUG @ Krimson
Drush Productivity FTW - DUG @ Krimson
 
Perl basics for Pentesters
Perl basics for PentestersPerl basics for Pentesters
Perl basics for Pentesters
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl style
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 

More from Francois Marier

Security and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power UsersSecurity and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power UsersFrancois Marier
 
Getting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your WebappGetting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your WebappFrancois Marier
 
Hardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyHardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyFrancois Marier
 
Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016Francois Marier
 
Privacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxPrivacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxFrancois Marier
 
Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015Francois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptFrancois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptFrancois Marier
 
Supporting Debian machines for friends and family
Supporting Debian machines for friends and familySupporting Debian machines for friends and family
Supporting Debian machines for friends and familyFrancois Marier
 
Outsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianOutsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianFrancois Marier
 
Easy logins for Ruby web applications
Easy logins for Ruby web applicationsEasy logins for Ruby web applications
Easy logins for Ruby web applicationsFrancois Marier
 
Easy logins for JavaScript web applications
Easy logins for JavaScript web applicationsEasy logins for JavaScript web applications
Easy logins for JavaScript web applicationsFrancois Marier
 
You're still using passwords on your site?
You're still using passwords on your site?You're still using passwords on your site?
You're still using passwords on your site?Francois Marier
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScriptFrancois Marier
 
Securing the Web without site-specific passwords
Securing the Web without site-specific passwordsSecuring the Web without site-specific passwords
Securing the Web without site-specific passwordsFrancois Marier
 
Easy logins for PHP web applications
Easy logins for PHP web applicationsEasy logins for PHP web applications
Easy logins for PHP web applicationsFrancois Marier
 
Persona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole WebPersona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole WebFrancois Marier
 
Taking the pain out of signing users in
Taking the pain out of signing users inTaking the pain out of signing users in
Taking the pain out of signing users inFrancois Marier
 

More from Francois Marier (20)

Security and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power UsersSecurity and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power Users
 
Getting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your WebappGetting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your Webapp
 
Hardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyHardening Firefox for Security and Privacy
Hardening Firefox for Security and Privacy
 
Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016
 
Privacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxPrivacy and Tracking Protection in Firefox
Privacy and Tracking Protection in Firefox
 
Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
 
Supporting Debian machines for friends and family
Supporting Debian machines for friends and familySupporting Debian machines for friends and family
Supporting Debian machines for friends and family
 
Outsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianOutsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to Debian
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
 
Easy logins for Ruby web applications
Easy logins for Ruby web applicationsEasy logins for Ruby web applications
Easy logins for Ruby web applications
 
Easy logins for JavaScript web applications
Easy logins for JavaScript web applicationsEasy logins for JavaScript web applications
Easy logins for JavaScript web applications
 
You're still using passwords on your site?
You're still using passwords on your site?You're still using passwords on your site?
You're still using passwords on your site?
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScript
 
Securing the Web without site-specific passwords
Securing the Web without site-specific passwordsSecuring the Web without site-specific passwords
Securing the Web without site-specific passwords
 
Easy logins for PHP web applications
Easy logins for PHP web applicationsEasy logins for PHP web applications
Easy logins for PHP web applications
 
Persona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole WebPersona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole Web
 
Taking the pain out of signing users in
Taking the pain out of signing users inTaking the pain out of signing users in
Taking the pain out of signing users in
 

Recently uploaded

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Recently uploaded (20)

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

35 Years of Open Source Software

  • 1.
  • 2. The Age of Incompatible Expensive Machines
  • 3.
  • 4.
  • 6. 1968 hardware software
  • 7. FORTRAN COBOL Algol
  • 8. #!/usr/bin/perl foreach (@pkglines) { # close REASON or chomp; # This program is free software; you can redistribute it and/or modify die "Can't close FILE [$file]: $!n"; $linenbr++; # it under the terms of the GNU General Public License as published by } if (/^Package:/) { # the Free Software Foundation; either version 2 of the License, or ($label, $pkg) = split(/:s+/,$_,2); # (at your option) any later version. # $pkgcnt++; # # Main program starts here. printf "pkg(%4.4d) pkg=[%s]n",$pkgcnt,$pkg if $debug >= 1; # This program is distributed in the hope that it will be useful, # $has_pkg = 1; ### we have necessary section # but WITHOUT ANY WARRANTY; without even the implied warranty of GetOptions('q|quiet' => $quiet, next; # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 's|sparse' => $sparse, } # GNU General Public License for more details. 'e|explain!' => $explain, if (/^Status:/) { # 'reason-dir=s' => $reasondir, my $label = ""; 'd|debug+' => $debug, ($label, $pkgstatus) = split(/:s+/,$_,2); use strict; 'h|help' => $help); print "tpkgstatus=[$pkgstatus]n" if $debug >= 1; use warnings; $pkg_status{$pkg} = $pkgstatus; if ($help) { ($plan, $state, $status) = split(/s+/,$pkgstatus); use Getopt::Long; usage(); print "ttplan=[$plan]n" if $debug >= 1; exit 0; print "ttstate=[$state]n" if $debug >= 1; # Declaration of important/main variables. } print "ttstatus=[$status]n" if $debug >= 1; my $quiet = 0; $has_status = 1; ### we have necessary section my $sparse = 0; opendir(REASONDIR, $reasondir) or next; my $help = 0; die "Can't open DIR [$reasondir]: $!n"; } my $explain = 1; # Parse all the reason files in $reasondir except those beginning with if (/^Section:/) { my $debug = 0; # a . or ending with a ~ my $label = ""; my $reasondir = '/usr/share/vrms/reasons/'; parse_reason_file("$reasondir/$_") ($label, $section) = split(/:s+/,$_,2); my %reason = (); foreach (grep {!/~$/ && !/^./} readdir(REASONDIR)); print "tsection=[$section]n" if $debug >= 1; closedir REASONDIR or $has_section = 1; ### we have necessary section # die "Can't close DIR [$reasondir]: $!n"; if ($section =~ /contrib|non-free|restricted|multiverse/) { # Auxiliary functions section (FIXME: put them in a file by themselves). ### read thru rest of array to find descr instead of waiting for it source code # my $statusfile = '/var/lib/dpkg/status'; my $found_descr =0; my $is_nonfree = 0; ### preset none found, yet while (! $found_descr) { # sub usage: my %nonfree = (); if ($linenbr > $#pkglines) { # Input: nothing. my $is_other_nonfree = 0; ### preset none found, yet ### iff badly formed entry ensure blank description # Output: Messages to stdout telling the usage of the program. my %other_nonfree = (); print "tEEEE shortdescr=[$shortdescr]n" if $debug >= 1; sub usage() { my $is_contrib = 0; ### preset none found, yet last; print <<EOF; my %contrib = (); } Usage: vrms [OPTIONS] ... my $is_other_contrib = 0; ### preset none found, yet my $dline = $pkglines[$linenbr++]; my %other_contrib = (); if($dline =~ /^Description:/) { --quiet, -q Do nothing if there are no non-free packages installed. my %pkg_status = (); ($label, $shortdescr) = split(/:s+/,$dline,2); --explain, -e Give a brief explanation of why a package is non-free, my $pkgcnt = 0; print "tshortdescr=[$shortdescr]n" if $debug >= 1; if available. my $clumpcnt = 0; $found_descr = 1; --sparse, -s Just list non-free packages, nothing else. my $dontcarelines = 5; ### no. of lines a non-installed entry may have in the } --reason-dir=DIR Use DIR as the reason directory. statusfile } --help, -h Display this help. if ($section =~ /contrib/) { --debug, -d Generate debugging information. if (lc $status eq 'installed') { my $sysname = ""; $is_contrib = 1; All options can be prefixed with "no" (eg: --noexplain) to turn them off. chop($sysname = `uname -n`); $contrib{$pkg} = $shortdescr; EOF } else { } open(PKG_SOURCE, "< $statusfile") or $is_other_contrib = 1; die "Can't open FILE [$statusfile]: $!n"; $other_contrib{$pkg} = $shortdescr; # sub parse_reason_file: } # Input: the name of a reason file and the global hash %reason $/ = ""; ### snarf a paragraph at a time } else { # Output: the hash %reason filled with reasons from the input file while(<PKG_SOURCE>) { if (lc $status eq 'installed') { # (FIXME: %reason shouldn't be global) my $clump = $_; $is_nonfree = 1; sub parse_reason_file { $clumpcnt++; $nonfree{$pkg} = $shortdescr; my $file = shift; my (@pkglines) = split(/n/, $clump); } else { print "Parsing reason file $filen" if $debug >= 1; ### iff more than $dontcarelines lines, package is installed, so process it $is_other_nonfree = 1; open(REASON, "<", $file) or ### (speed-up by skipping don't-care entries) $other_nonfree{$pkg} = $shortdescr; die "Can't open FILE [$file]: $!n"; if (@pkglines > $dontcarelines) { } my $pkg = ""; ### name of this package } while (my $line = <REASON>) { my $pkgstatus = ""; ### status } chomp $line; my $plan = ""; ### install plan (hold, deinstall, purge, install, etc.) last; ### this is last desriptor of package we care about so end loop # Grab a line of the form 'package: reason', skip if we don't match my $state = ""; ### state (ok or ???) } else { my ($pkg, $reason) = ($line =~ /^(S+):s+(.*)s*$/) or next; my $status = ""; ### status (installed, not-installed, etc.) ### un-processed lines from package info print "'$pkg' because '$reason'n" if ($debug >= 1); my $section = ""; ### section this is where non-free is marked if($debug >= 1) { my $shortdescr = ""; ### one-liner description of pkg print "tt--- $_n"; # If this is _our_ master file, then prefer anything my $linenbr = 0; ### current line number of this pkackag's info } # else (so that package maintainers can override) my $label = ""; ### junk field (not used, except to catch split values) } next if exists $reason{$pkg} and $file =~ //vrms$/; my $has_pkg = 0; ### reset the markers } my $has_status = 0; if (!$has_status or !$has_pkg) { $reason{$pkg} = $reason; my $has_section = 0; print STDERR "vrms: ERROR- Badly formed dpkg-status entry #$clumpcnt!n"; } print STDERR " pkg=[$pkg], pkgstatus=[$pkgstatus], section=[$section] n"; }
  • 10.
  • 11.
  • 12.
  • 15. most widely and deeply understood trade secret in the history of computing
  • 16. sharing innovations & bug fixes
  • 17.
  • 18.
  • 19.
  • 21. 1980
  • 23.
  • 24.
  • 25.
  • 28.
  • 29. The Rise of Free Software
  • 30.
  • 31.
  • 32. 1984
  • 34. Free as in speech
  • 35. Free as in freedom
  • 36. Free as in beer
  • 37. 1. use 2. copy 3. modify 4. contribute
  • 38.
  • 39. 1989, 1991 GPL
  • 40. you must extend the same freedoms to others
  • 43. you give complete freedom to developers
  • 44.
  • 45.
  • 46.
  • 47.
  • 48. 1993
  • 49. 1995
  • 51. Free Software Becomes Mainstream
  • 52.
  • 53. 1998
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 76.
  • 77.
  • 78.
  • 80.
  • 81.
  • 82.
  • 83.
  • 86.
  • 88. Photo credits: ibm 360 with people: http://www.flickr.com/photos/cote/54408562/sizes/l/in/photostream/ cdc6600: https://secure.wikimedia.org/wikipedia/en/wiki/File:Personable_Computer.jpg ken and dennis with medals: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Medal_lg.jpeg warrington logo: http://wikieducator.org/File:Warrington_logo.png ashs logo: http://wikieducator.org/File:ASHS_logo.png wanted poster: http://www.flickr.com/photos/mscaprikell/59580038/in/photostream/ tape: http://www.flickr.com/photos/leejordan/486911915/ tim o'reilly: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Tim_O%27Reilly_in_Foo_China_200 fsf logo: https://secure.wikimedia.org/wikipedia/en/wiki/File:FSF-Logo.svg tux: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Tux.svg open source: https://secure.wikimedia.org/wikipedia/commons/wiki/File:Opensource.svg stock market: http://www.flickr.com/photos/thewalkingirony/3051500551/ android logo: https://secure.wikimedia.org/wikipedia/en/wiki/File:Android_logo.svg in-flight entertainment: http://www.flickr.com/photos/kalleboo/2473197800/ samsung tv: http://www.flickr.com/photos/johannesfreund/2320330661/ Linus: http://en.wikipedia.org/wiki/File:Linus_Torvalds.jpeg Bill Gates: http://en.wikipedia.org/wiki/File:Bill_Gates_in_WEF_,2007.jpg Bruce Perens: [not CC] http://perens.com/press/photos/ Lawrence Lessig: http://en.wikipedia.org/wiki/File:Lessig_portrait.jpg Jimmy Wales: http://en.wikipedia.org/wiki/File:Jimmy_Wales_Fundraiser_Appeal_edit.jpg Steve Ballmer: http://en.wikipedia.org/wiki/File:Steve_ballmer_2007_outdoors2.jpg us department of justice: https://secure.wikimedia.org/wikipedia/en/wiki/File:US-DeptOfJustice-Seal.svg