520 likes | 604 Views
Why Open Source?. Karl Fogel. kfogel@opentechstrategies.com. What is Open Source?. Karl Fogel. kfogel@opentechstrategies.com. Open source software is software that may be modified and redistributed freely by anyone, with no restrictions on how the code may be
E N D
Why Open Source? Karl Fogel kfogel@opentechstrategies.com
What is Open Source? Karl Fogel kfogel@opentechstrategies.com
Open source software is software that may be modified and redistributed freely by anyone, with no restrictions on how the code may be changed, the uses to which it may be put, or the parties with whom it may be shared.
Open source software is commercial (COTS) • It's just not proprietary
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software”
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify)
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify) • Lots of religious wars in open source
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify) • Lots of religious wars in open source • But not about the definition
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify) • Lots of religious wars in open source • But not about the definition • You open source your code, not your time
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify) • Lots of religious wars in open source • But not about the definition • You open source your code, not your time • You control your copies
Open source software is commercial (COTS) • It's just not proprietary • No such thing as academic-only OSS • No such thing as non-profit-only OSS • “Open source” same as “free software” • Copyleft vs non-copyleft (both qualify) • Lots of religious wars in open source • But not about the definition • You open source your code, not your time • You control your copies
A Plethora of Acronyms Free Software (Wait, that's not an acronym.) OSS Open Source Software F/OSS Free / Open Source Software FLOSS Free / Libre / Open Source Software
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } } // Redirect requests for servlet name without a trailing slash. // Jetty does this automatically for /servlet_name, Tomcat does not. function slash(app) { return function(request) { var servletRequest = request.env.servletRequest; var pathInfo = servletRequest.getPathInfo(); if (pathInfo === "/") { var uri = servletRequest.getRequestURI(); if (uri.charAt(uri.length-1) !== "/") { var location = servletRequest.getScheme() + "://" + servletRequest.getServerName() + ":" + servletRequest.getServerPort() + uri + "/"; return { status: 301, headers: {"Location": location}, body: [] }; } } return app(request); }; }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver // by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver // by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver // by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver // by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } }
--- geoexplorer-app-main.js 2012-06-09 20:08:02 +++ geoexplorer-app-main.js 2012-06-09 20:08:12 @@ -12,7 +12,7 @@ var geoserver = java.lang.System.getProperty("...geo..."); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { - geoserver = geoserver + "/"; + geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass(
--- geoexplorer-app-main.js 2012-06-09 20:08:02 +++ geoexplorer-app-main.js 2012-06-09 20:08:12 @@ -12,7 +12,7 @@ var geoserver = java.lang.System.getProperty("...geo..."); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { - geoserver = geoserver + "/"; + geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass(
--- geoexplorer-app-main.js 2012-06-09 20:08:02 +++ geoexplorer-app-main.js 2012-06-09 20:08:12 @@ -12,7 +12,7 @@ var geoserver = java.lang.System.getProperty("...geo..."); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { - geoserver = geoserver + "/"; + geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass(
--- geoexplorer-app-main.js 2012-06-09 20:08:02 +++ geoexplorer-app-main.js 2012-06-09 20:08:12 @@ -12,7 +12,7 @@ var geoserver = java.lang.System.getProperty("...geo..."); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { - geoserver = geoserver + "/"; + geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass(
--- geoexplorer-app-main.js 2012-06-09 20:08:02 +++ geoexplorer-app-main.js 2012-06-09 20:08:12 @@ -12,7 +12,7 @@ var geoserver = java.lang.System.getProperty("...geo..."); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { - geoserver = geoserver + "/"; + geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass(
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } } // Redirect requests for servlet name without a trailing slash. // Jetty does this automatically for /servlet_name, Tomcat does not. function slash(app) { return function(request) { var servletRequest = request.env.servletRequest; var pathInfo = servletRequest.getPathInfo(); if (pathInfo === "/") { var uri = servletRequest.getRequestURI(); if (uri.charAt(uri.length-1) !== "/") { var location = servletRequest.getScheme() + "://" + servletRequest.getServerName() + ":" + servletRequest.getServerPort() + uri + "/"; return { status: 301, headers: {"Location": location}, body: [] }; } } return app(request); }; }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } } // Redirect requests for servlet name without a trailing slash. // Jetty does this automatically for /servlet_name, Tomcat does not. function slash(app) { return function(request) { var servletRequest = request.env.servletRequest; var pathInfo = servletRequest.getPathInfo(); if (pathInfo === "/") { var uri = servletRequest.getRequestURI(); if (uri.charAt(uri.length-1) !== "/") { var location = servletRequest.getScheme() + "://" + servletRequest.getServerName() + ":" + servletRequest.getServerPort() + uri + "/"; return { status: 301, headers: {"Location": location}, body: [] }; } } return app(request); }; }
// debug mode loads unminified scripts // assumes markup pulls in scripts under the path /servlet_name/script/ if (java.lang.System.getProperty("app.debug")) { var fs = require("fs"); var config = fs.normal(fs.join(module.directory, "..", "bjs.cfg")); app.mount("/script/", require("./autoloader").App(config)); // proxy a remote geoserver on /geoserver by setting app.proxy.geoserver to remote URL // only recommended for debug mode var geoserver = java.lang.System.getProperty("app.proxy.geoserver"); if (geoserver) { if (geoserver.charAt(geoserver.length-1) !== "/") { geoserver = geoserver + "/dennis-wuthrich/"; } // debug specific proxy app.mount("/geoserver/", require("./root/proxy").pass( {url: geoserver, preserveHost: true, allowAuth: true})); } } // Redirect requests for servlet name without a trailing slash. // Jetty does this automatically for /servlet_name, Tomcat does not. function slash(app) { return function(request) { var servletRequest = request.env.servletRequest; var pathInfo = servletRequest.getPathInfo(); if (pathInfo === "/") { var uri = servletRequest.getRequestURI(); if (uri.charAt(uri.length-1) !== "/") { var location = servletRequest.getScheme() + "://" + servletRequest.getServerName() + ":" + servletRequest.getServerPort() + uri + "/"; return { status: 301, headers: {"Location": location}, body: [] }; } } return app(request); }; }
Advantages of Open Source • Avoid lock-in
Advantages of Open Source • Avoid lock-in • Adaptability
Advantages of Open Source • Avoid lock-in • Adaptability • Framework for collaboration
Advantages of Open Source • Avoid lock-in • Adaptability • Framework for collaboration • Lower experimentation costs
Advantages of Open Source • Avoid lock-in • Adaptability • Framework for collaboration • Lower experimentation costs • Talent discovery
Advantages of Open Source • Avoid lock-in • Adaptability • Framework for collaboration • Lower experimentation costs • Talent discovery • Philosophical warm fuzzies
Low-stakes governance • Responsibility flows in from the periphery • Pool of contributors • Expertise accummulates everywhere • No one can be alienated from their work • Commercial participation encouraged
Open Source Software + = €$
“Producing Open Source Software” producingoss.com