text:
module Gem
  QUICKLOADER_SUCKAGE = RUBY_VERSION =~ /^1\.9\.1/

  # Only MRI 1.9.2 has the custom prelude.
  GEM_PRELUDE_SUCKAGE = RUBY_VERSION =~ /^1\.9\.2/ && RUBY_ENGINE == "ruby"
end

if Gem::GEM_PRELUDE_SUCKAGE and defined?(Gem::QuickLoader) then
  Gem::QuickLoader.remove

  $LOADED_FEATURES.delete Gem::QuickLoader.path_to_full_rubygems_library

  if $LOADED_FEATURES.any? do |path| path.end_with? '/rubygems.rb' end then
    # TODO path does not exist here
    raise LoadError, "another rubygems is already loaded from #{path}"
  end

  class << Gem
    remove_method :try_activate if Gem.respond_to?(:try_activate, true)
  end
end

require 'rubygems/defaults'
require 'rbconfig'
require "rubygems/deprecate"

##
# RubyGems is the Ruby standard for publishing and managing third party
# libraries.
#
# For user documentation, see:
#
# * <tt>gem help</tt> and <tt>gem help [command]</tt>
# * {RubyGems User Guide}[http://docs.rubygems.org/read/book/1]
# * {Frequently Asked Questions}[http://docs.rubygems.org/read/book/3]
#
# For gem developer documentation see:
#
# * {Creating Gems}[http://docs.rubygems.org/read/chapter/5]
# * Gem::Specification
# * Gem::Version for version dependency notes
#
# Further RubyGems documentation can be found at:
#
# * {RubyGems API}[http://rubygems.rubyforge.org/rdoc] (also available from
#   <tt>gem server</tt>)
# * {RubyGems Bookshelf}[http://rubygem.org]
#
# == RubyGems Plugins
#
# As of RubyGems 1.3.2, RubyGems will load plugins installed in gems or
# $LOAD_PATH.  Plugins must be named 'rubygems_plugin' (.rb, .so, etc) and
# placed at the root of your gem's #require_path.  Plugins are discovered via
# Gem::find_files then loaded.  Take care when implementing a plugin as your
# plugin file may be loaded multiple times if multiple versions of your gem
# are installed.
#
# For an example plugin, see the graph gem which adds a `gem graph` command.
#
# == RubyGems Defaults, Packaging
#
# RubyGems defaults are stored in rubygems/defaults.rb.  If you're packaging
# RubyGems or implementing Ruby you can change RubyGems' defaults.
#
# For RubyGems packagers, provide lib/rubygems/operating_system.rb and
# override any defaults from lib/rubygems/defaults.rb.
#
# For Ruby implementers, provide lib/rubygems/#{RUBY_ENGINE}.rb and override
# any defaults from lib/rubygems/defaults.rb.
#
# If you need RubyGems to perform extra work on install or uninstall, your
# defaults override file can set pre and post install and uninstall hooks.
# See Gem::pre_install, Gem::pre_uninstall, Gem::post_install,
# Gem::post_uninstall.
#
# == Bugs
#
# You can submit bugs to the
# {RubyGems bug tracker}[http://rubyforge.org/tracker/?atid=575&group_id=126]
# on RubyForge
#
# == Credits
#
# RubyGems is currently maintained by Eric Hodel.
#
# RubyGems was originally developed at RubyConf 2003 by:
#
# * Rich Kilmer  -- rich(at)infoether.com
# * Chad Fowler  -- chad(at)chadfowler.com
# * David Black  -- dblack(at)wobblini.net
# * Paul Brannan -- paul(at)atdesk.com
# * Jim Weirch   -- jim(at)weirichhouse.org
#
# Contributors:
#
# * Gavin Sinclair     -- gsinclair(at)soyabean.com.au
# * George Marrows     -- george.marrows(at)ntlworld.com
# * Dick Davies        -- rasputnik(at)hellooperator.net
# * Mauricio Fernandez -- batsman.geo(at)yahoo.com
# * Simon Strandgaard  -- neoneye(at)adslhome.dk
# * Dave Glasser       -- glasser(at)mit.edu
# * Paul Duncan        -- pabs(at)pablotron.org
# * Ville Aine         -- vaine(at)cs.helsinki.fi
# * Eric Hodel         -- drbrain(at)segment7.net
# * Daniel Berger      -- djberg96(at)gmail.com
# * Phil Hagelberg     -- technomancy(at)gmail.com
# * Ryan Davis         -- ryand-ruby(at)zenspider.com
#
# (If your name is missing, PLEASE let us know!)
#
# Thanks!
#
# -The RubyGems Team

module Gem
  VERSION = '1.8.20'

  ##
  # Raised when RubyGems is unable to load or activate a gem.  Contains the
  # name and version requirements of the gem that either conflicts with
  # already activated gems or that RubyGems is otherwise unable to activate.

  class LoadError < ::LoadError
    # Name of gem
    attr_accessor :name

    # Version requirement of gem
    attr_accessor :requirement
  end

  # :stopdoc:

  RubyGemsVersion = VERSION

  RbConfigPriorities = %w[
    EXEEXT RUBY_SO_NAME arch bindir datadir libdir ruby_install_name
    ruby_version rubylibprefix sitedir sitelibdir vendordir vendorlibdir
  ]

  unless defined?(ConfigMap)
    ##
    # Configuration settings from ::RbConfig
    ConfigMap = Hash.new do |cm, key|
      cm[key] = RbConfig::CONFIG[key.to_s]
    end
  else
    RbConfigPriorities.each do |key|
      ConfigMap[key.to_sym] = RbConfig::CONFIG[key]
    end
  end

  RubyGemsPackageVersion = VERSION

  RUBYGEMS_DIR = File.dirname File.expand_path(__FILE__)

  # :startdoc:

  ##
  # An Array of Regexps that match windows ruby platforms.

  WIN_PATTERNS = [
    /bccwin/i,
    /cygwin/i,
    /djgpp/i,
    /mingw/i,
    /mswin/i,
    /wince/i,
  ]

  @@source_index = nil
  @@win_platform = nil

  @configuration = nil
  @loaded_specs = {}
  @platforms = []
  @ruby = nil
  @sources = nil

  @post_build_hooks     ||= []
  @post_install_hooks   ||= []
  @post_uninstall_hooks ||= []
  @pre_uninstall_hooks  ||= []
  @pre_install_hooks    ||= []
  @pre_reset_hooks      ||= []
  @post_reset_hooks     ||= []

  ##
  # Try to activate a gem containing +path+. Returns true if
  # activation succeeded or wasn't needed because it was already
  # activated. Returns false if it can't find the path in a gem.

  def self.try_activate path
    # TODO: deprecate when 1.9.3 comes out.
    # finds the _latest_ version... regardless of loaded specs and their deps

    # TODO: use find_all and bork if ambiguous

    spec = Gem::Specification.find_by_path path
    return false unless spec

    begin
      spec.activate
    rescue Gem::LoadError # this could fail due to gem dep collisions, go lax
      Gem::Specification.find_by_name(spec.name).activate
    end

    return true
  end

  ##
  # Activates an installed gem matching +dep+.  The gem must satisfy
  # +requirements+.
  #
  # Returns true if the gem is activated, false if it is already
  # loaded, or an exception otherwise.
  #
  # Gem#activate adds the library paths in +dep+ to $LOAD_PATH.  Before a Gem
  # is activated its required Gems are activated.  If the version information
  # is omitted, the highest version Gem of the supplied name is loaded.  If a
  # Gem is not found that meets the version requirements or a required Gem is
  # not found, a Gem::LoadError is raised.
  #
  # More information on version requirements can be found in the
  # Gem::Requirement and Gem::Version documentation.

  def self.activate(dep, *requirements)
    raise ArgumentError, "Deprecated use of Gem.activate(dep)" if
      Gem::Dependency === dep

    Gem::Specification.find_by_name(dep, *requirements).activate
  end

  def self.activate_dep dep, *requirements # :nodoc:
    dep.to_spec.activate
  end

  def self.activate_spec spec # :nodoc:
    spec.activate
  end

  def self.unresolved_deps
    @unresolved_deps ||= Hash.new { |h, n| h[n] = Gem::Dependency.new n }
  end

  ##
  # An Array of all possible load paths for all versions of all gems in the
  # Gem installation.

  def self.all_load_paths
    result = []

    Gem.path.each do |gemdir|
      each_load_path all_partials(gemdir) do |load_path|
        result << load_path
      end
    end

    result
  end

  ##
  # Return all the partial paths in +gemdir+.

  def self.all_partials(gemdir)
    Dir[File.join(gemdir, "gems/*")]
  end

  private_class_method :all_partials

  ##
  # See if a given gem is available.

  def self.available?(dep, *requirements)
    requirements = Gem::Requirement.default if requirements.empty?

    unless dep.respond_to?(:name) and dep.respond_to?(:requirement) then
      dep = Gem::Dependency.new dep, requirements
    end

    not dep.matching_specs(true).empty?
  end

  ##
  # Find the full path to the executable for gem +name+.  If the +exec_name+
  # is not given, the gem's default_executable is chosen, otherwise the
  # specified executable's path is returned.  +requirements+ allows
  # you to specify specific gem versions.

  def self.bin_path(name, exec_name = nil, *requirements)
    # TODO: fails test_self_bin_path_bin_file_gone_in_latest
    # Gem::Specification.find_by_name(name, *requirements).bin_file exec_name

    raise ArgumentError, "you must supply exec_name" unless exec_name

    requirements = Gem::Requirement.default if
      requirements.empty?

    specs = Gem::Dependency.new(name, requirements).matching_specs(true)

    raise Gem::GemNotFoundException,
          "can't find gem #{name} (#{requirements})" if specs.empty?

    specs = specs.find_all { |spec|
      spec.executables.include? exec_name
    } if exec_name

    unless spec = specs.last
      msg = "can't find gem #{name} (#{requirements}) with executable #{exec_name}"
      raise Gem::GemNotFoundException, msg
    end

    spec.bin_file exec_name
  end

  ##
  # The mode needed to read a file as straight binary.

  def self.binary_mode
    'rb'
  end

  ##
  # The path where gem executables are to be installed.

  def self.bindir(install_dir=Gem.dir)
    # TODO: move to Gem::Dirs
    return File.join install_dir, 'bin' unless
      install_dir.to_s == Gem.default_dir.to_s
    Gem.default_bindir
  end

  ##
  # Reset the +dir+ and +path+ values.  The next time +dir+ or +path+
  # is requested, the values will be calculated from scratch.  This is
  # mainly used by the unit tests to provide test isolation.

  def self.clear_paths
    @@source_index = nil
    @paths         = nil
    @user_home     = nil
    @searcher      = nil
    Gem::Specification.reset
  end

  ##
  # The path to standard location of the user's .gemrc file.

  def self.config_file
    @config_file ||= File.join Gem.user_home, '.gemrc'
  end

  ##
  # The standard configuration object for gems.

  def self.configuration
    @configuration ||= Gem::ConfigFile.new []
  end

  ##
  # Use the given configuration object (which implements the ConfigFile
  # protocol) as the standard configuration object.

  def self.configuration=(config)
    @configuration = config
  end

  ##
  # The path the the data directory specified by the gem name.  If the
  # package is not available as a gem, return nil.

  def self.datadir(gem_name)
# TODO: deprecate
    spec = @loaded_specs[gem_name]
    return nil if spec.nil?
    File.join spec.full_gem_path, "data", gem_name
  end

  ##
  # A Zlib::Deflate.deflate wrapper

  def self.deflate(data)
    require 'zlib'
    Zlib::Deflate.deflate data
  end

  def self.paths
    @paths ||= Gem::PathSupport.new
  end

  def self.paths=(env)
    clear_paths
    @paths = Gem::PathSupport.new env
    Gem::Specification.dirs = @paths.path # FIX: home is at end
  end

  ##
  # The path where gems are to be installed.
  #--
  # FIXME deprecate these once everything else has been done -ebh

  def self.dir
    # TODO: raise "no"
    paths.home
  end

  def self.path
    # TODO: raise "no"
    paths.path
  end

  ##
  # Expand each partial gem path with each of the required paths specified
  # in the Gem spec.  Each expanded path is yielded.

  def self.each_load_path(partials)
    partials.each do |gp|
      base = File.basename gp
      specfn = File.join(dir, "specifications", "#{base}.gemspec")
      if File.exists? specfn
        spec = eval(File.read(specfn))
        spec.require_paths.each do |rp|
          yield File.join(gp,rp)
        end
      else
        filename = File.join(gp, 'lib')
        yield(filename) if File.exists? filename
      end
    end
  end

  private_class_method :each_load_path

  ##
  # Quietly ensure the named Gem directory contains all the proper
  # subdirectories.  If we can't create a directory due to a permission
  # problem, then we will silently continue.

  def self.ensure_gem_subdirectories dir = Gem.dir
    old_umask = File.umask
    File.umask old_umask | 002

    require 'fileutils'

    %w[cache doc gems specifications].each do |name|
      subdir = File.join dir, name
      next if File.exist? subdir
      FileUtils.mkdir_p subdir rescue nil # in case of perms issues -- lame
    end
  ensure
    File.umask old_umask
  end

  ##
  # Returns a list of paths matching +glob+ that can be used by a gem to pick
  # up features from other gems.  For example:
  #
  #   Gem.find_files('rdoc/discover').each do |path| load path end
  #
  # if +check_load_path+ is true (the default), then find_files also searches
  # $LOAD_PATH for files as well as gems.
  #
  # Note that find_files will return all files even if they are from different
  # versions of the same gem.

  def self.find_files(glob, check_load_path=true)
    files = []

    if check_load_path
      files = $LOAD_PATH.map { |load_path|
        Dir["#{File.expand_path glob, load_path}#{Gem.suffix_pattern}"]
      }.flatten.select { |file| File.file? file.untaint }
    end

    files.concat Gem::Specification.map { |spec|
      spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
    }.flatten

    # $LOAD_PATH might contain duplicate entries or reference
    # the spec dirs directly, so we prune.
    files.uniq! if check_load_path

    return files
  end

  ##
  # Finds the user's home directory.
  #--
  # Some comments from the ruby-talk list regarding finding the home
  # directory:
  #
  #   I have HOME, USERPROFILE and HOMEDRIVE + HOMEPATH. Ruby seems
  #   to be depending on HOME in those code samples. I propose that
  #   it should fallback to USERPROFILE and HOMEDRIVE + HOMEPATH (at
  #   least on Win32).
  #++
  #--
  #
  # FIXME move to pathsupport
  #
  #++

  def self.find_home
    windows = File::ALT_SEPARATOR
    if not windows or RUBY_VERSION >= '1.9' then
      File.expand_path "~"
    else
      ['HOME', 'USERPROFILE'].each do |key|
        return File.expand_path ENV[key] if ENV[key]
      end

      if ENV['HOMEDRIVE'] && ENV['HOMEPATH'] then
        File.expand_path "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}"
      end
    end
  rescue
    if windows then
      File.expand_path File.join(ENV['HOMEDRIVE'] || ENV['SystemDrive'], '/')
    else
      File.expand_path "/"
    end
  end

  private_class_method :find_home

  ##
  # Zlib::GzipReader wrapper that unzips +data+.

  def self.gunzip(data)
    # TODO: move to utils
    require 'stringio'
    require 'zlib'
    data = StringIO.new data

    Zlib::GzipReader.new(data).read
  end

  ##
  # Zlib::GzipWriter wrapper that zips +data+.

  def self.gzip(data)
    # TODO: move to utils
    require 'stringio'
    require 'zlib'
    zipped = StringIO.new

    Zlib::GzipWriter.wrap zipped do |io| io.write data end

    zipped.string
  end

  ##
  # A Zlib::Inflate#inflate wrapper

  def self.inflate(data)
    # TODO: move to utils
    require 'zlib'
    Zlib::Inflate.inflate data
  end

  ##
  # Get the default RubyGems API host. This is normally
  # <tt>https://rubygems.org</tt>.

  def self.host
    # TODO: move to utils
    @host ||= "https://rubygems.org"
  end

  ## Set the default RubyGems API host.

  def self.host= host
    # TODO: move to utils
    @host = host
  end

  ##
  # Return a list of all possible load paths for the latest version for all
  # gems in the Gem installation.

  def self.latest_load_paths
    result = []

    Gem.path.each do |gemdir|
      each_load_path(latest_partials(gemdir)) do |load_path|
        result << load_path
      end
    end

    result
  end

  ##
  # Return only the latest partial paths in the given +gemdir+.

  def self.latest_partials(gemdir)
    latest = {}
    all_partials(gemdir).each do |gp|
      base = File.basename gp

      if base.to_s =~ /(.*)-((\d+\.)*\d+)/ then
        name, version = $1, $2
        ver = Gem::Version.new(version)
        if latest[name].nil? || ver > latest[name][0]
          latest[name] = [ver, gp]
        end
      end
    end
    latest.collect { |k,v| v[1] }
  end

  private_class_method :latest_partials

  ##
  # The index to insert activated gem paths into the $LOAD_PATH.
  #
  # Defaults to the site lib directory unless gem_prelude.rb has loaded paths,
  # then it inserts the activated gem's paths before the gem_prelude.rb paths
  # so you can override the gem_prelude.rb default $LOAD_PATH paths.

  def self.load_path_insert_index
    index = $LOAD_PATH.index ConfigMap[:sitelibdir]

    if QUICKLOADER_SUCKAGE then
      $LOAD_PATH.each_with_index do |path, i|
        if path.instance_variables.include?(:@gem_prelude_index) or
            path.instance_variables.include?('@gem_prelude_index') then
          index = i
          break
        end
      end
    end

    index
  end

  @yaml_loaded = false

  ##
  # Loads YAML, preferring Psych

  def self.load_yaml
    return if @yaml_loaded

    test_syck = ENV['TEST_SYCK']

    unless test_syck
      begin
        gem 'psych', '~> 1.2', '>= 1.2.1'
      rescue Gem::LoadError
        # It's OK if the user does not have the psych gem installed.  We will
        # attempt to require the stdlib version
      end

      begin
        # Try requiring the gem version *or* stdlib version of psych.
        require 'psych'
      rescue ::LoadError
        # If we can't load psych, thats fine, go on.
      else
        # If 'yaml' has already been required, then we have to
        # be sure to switch it over to the newly loaded psych.
        if defined?(YAML::ENGINE) && YAML::ENGINE.yamler != "psych"
          YAML::ENGINE.yamler = "psych"
        end

        require 'rubygems/psych_additions'
        require 'rubygems/psych_tree'
      end
    end

    require 'yaml'

    # If we're supposed to be using syck, then we may have to force
    # activate it via the YAML::ENGINE API.
    if test_syck and defined?(YAML::ENGINE)
      YAML::ENGINE.yamler = "syck" unless YAML::ENGINE.syck?
    end

    # Now that we're sure some kind of yaml library is loaded, pull
    # in our hack to deal with Syck's DefaultKey ugliness.
    require 'rubygems/syck_hack'

    @yaml_loaded = true
  end

  ##
  # The file name and line number of the caller of the caller of this method.

  def self.location_of_caller
    caller[1] =~ /(.*?):(\d+).*?$/i
    file = $1
    lineno = $2.to_i

    # TODO: it is ALWAYS joined! STUPID!
    [file, lineno]
  end

  ##
  # The version of the Marshal format for your Ruby.

  def self.marshal_version
    "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
  end

  ##
  # Get the appropriate cache path.
  #
  # Pass a string to use a different base path, or nil/false (default) for
  # Gem.dir.
  #

  def self.cache_dir(custom_dir=false)
    File.join(custom_dir || Gem.dir, "cache")
  end

  ##
  # Given a gem path, find the gem in cache.
  #
  # Pass a string as the second argument to use a different base path, or
  # nil/false (default) for Gem.dir.

  def self.cache_gem(filename, user_dir=false)
    cache_dir(user_dir).add(filename)
  end

  ##
  # Set array of platforms this RubyGems supports (primarily for testing).

  def self.platforms=(platforms)
    @platforms = platforms
  end

  ##
  # Array of platforms this RubyGems supports.

  def self.platforms
    @platforms ||= []
    if @platforms.empty?
      @platforms = [Gem::Platform::RUBY, Gem::Platform.local]
    end
    @platforms
  end

  ##
  # Adds a post-build hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called.  The hook is called after the gem
  # has been extracted and extensions have been built but before the
  # executables or gemspec has been written.  If the hook returns +false+ then
  # the gem's files will be removed and the install will be aborted.

  def self.post_build(&hook)
    @post_build_hooks << hook
  end

  ##
  # Adds a post-install hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called

  def self.post_install(&hook)
    @post_install_hooks << hook
  end

  ##
  # Adds a hook that will get run after Gem::Specification.reset is
  # run.

  def self.post_reset(&hook)
    @post_reset_hooks << hook
  end

  ##
  # Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance
  # and the spec that was uninstalled when Gem::Uninstaller#uninstall is
  # called

  def self.post_uninstall(&hook)
    @post_uninstall_hooks << hook
  end

  ##
  # Adds a pre-install hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called.  If the hook returns +false+ then
  # the install will be aborted.

  def self.pre_install(&hook)
    @pre_install_hooks << hook
  end

  ##
  # Adds a hook that will get run before Gem::Specification.reset is
  # run.

  def self.pre_reset(&hook)
    @pre_reset_hooks << hook
  end

  ##
  # Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance
  # and the spec that will be uninstalled when Gem::Uninstaller#uninstall is
  # called

  def self.pre_uninstall(&hook)
    @pre_uninstall_hooks << hook
  end

  ##
  # The directory prefix this RubyGems was installed at. If your
  # prefix is in a standard location (ie, rubygems is installed where
  # you'd expect it to be), then prefix returns nil.

  def self.prefix
    prefix = File.dirname RUBYGEMS_DIR

    if prefix != File.expand_path(ConfigMap[:sitelibdir]) and
       prefix != File.expand_path(ConfigMap[:libdir]) and
       'lib' == File.basename(RUBYGEMS_DIR) then
      prefix
    end
  end

  ##
  # Promotes the load paths of the +gem_name+ over the load paths of
  # +over_name+.  Useful for allowing one gem to override features in another
  # using #find_files.

  def self.promote_load_path(gem_name, over_name)
    gem = Gem.loaded_specs[gem_name]
    over = Gem.loaded_specs[over_name]

    raise ArgumentError, "gem #{gem_name} is not activated" if gem.nil?
    raise ArgumentError, "gem #{over_name} is not activated" if over.nil?

    last_gem_path = Gem::Path.path(gem.full_gem_path).add(gem.require_paths.last)

    over_paths = over.require_paths.map do |path|
      Gem::Path.path(over.full_gem_path).add(path).to_s
    end

    over_paths.each do |path|
      $LOAD_PATH.delete path
    end

    gem = $LOAD_PATH.index(last_gem_path) + 1

    $LOAD_PATH.insert(gem, *over_paths)
  end

  ##
  # Refresh source_index from disk and clear searcher.

  def self.refresh
    Gem::Specification.reset
    @source_index = nil
    @searcher = nil
  end

  ##
  # Safely read a file in binary mode on all platforms.

  def self.read_binary(path)
    File.open path, binary_mode do |f| f.read end
  end

  ##
  # Report a load error during activation.  The message of load error
  # depends on whether it was a version mismatch or if there are not gems of
  # any version by the requested name.

  def self.report_activate_error(gem)
    matches = Gem::Specification.find_by_name(gem.name)

    if matches.empty? then
      error = Gem::LoadError.new(
          "Could not find RubyGem #{gem.name} (#{gem.requirement})\n")
    else
      error = Gem::LoadError.new(
          "RubyGem version error: " +
          "#{gem.name}(#{matches.first.version} not #{gem.requirement})\n")
    end

    error.name = gem.name
    error.requirement = gem.requirement
    raise error
  end

  private_class_method :report_activate_error

  ##
  # Full path to +libfile+ in +gemname+.  Searches for the latest gem unless
  # +requirements+ is given.

  def self.required_location(gemname, libfile, *requirements)
    requirements = Gem::Requirement.default if requirements.empty?

    matches = Gem::Specification.find_all_by_name gemname, *requirements

    return nil if matches.empty?

    spec = matches.last
    spec.require_paths.each do |path|
      result = Gem::Path.path(spec.full_gem_path).add(path, libfile)
      return result if result.exist?
    end

    nil
  end

  ##
  # The path to the running Ruby interpreter.

  def self.ruby
    if @ruby.nil? then
      @ruby = File.join(ConfigMap[:bindir],
                        "#{ConfigMap[:ruby_install_name]}#{ConfigMap[:EXEEXT]}")

      @ruby = "\"#{@ruby}\"" if @ruby =~ /\s/
    end

    @ruby
  end

  def self.latest_spec_for name
    dependency  = Gem::Dependency.new name
    fetcher     = Gem::SpecFetcher.fetcher
    spec_tuples = fetcher.find_matching dependency

    match = spec_tuples.select { |(n, _, p), _|
      n == name and Gem::Platform.match p
    }.sort_by { |(_, version, _), _|
      version
    }.last

    match and fetcher.fetch_spec(*match)
  end

  def self.latest_version_for name
    spec = latest_spec_for name
    spec and spec.version
  end

  def self.latest_rubygems_version
    latest_version_for "rubygems-update"
  end

  ##
  # A Gem::Version for the currently running ruby.

  def self.ruby_version
    return @ruby_version if defined? @ruby_version
    version = RUBY_VERSION.dup

    if defined?(RUBY_PATCHLEVEL) && RUBY_PATCHLEVEL != -1 then
      version << ".#{RUBY_PATCHLEVEL}"
    elsif defined?(RUBY_REVISION) then
      version << ".dev.#{RUBY_REVISION}"
    end

    @ruby_version = Gem::Version.new version
  end

  ##
  # The GemPathSearcher object used to search for matching installed gems.

  def self.searcher
    @searcher ||= Gem::GemPathSearcher.new
  end

  ##
  # Returns the Gem::SourceIndex of specifications that are in the Gem.path

  def self.source_index
    @@source_index ||= Gem::Deprecate.skip_during do
      SourceIndex.new Gem::Specification.dirs
    end
  end

  ##
  # Returns an Array of sources to fetch remote gems from.  If the sources
  # list is empty, attempts to load the "sources" gem, then uses
  # default_sources if it is not installed.

  def self.sources
    @sources ||= default_sources
  end

  ##
  # Need to be able to set the sources without calling
  # Gem.sources.replace since that would cause an infinite loop.

  def self.sources= new_sources
    @sources = new_sources
  end

  ##
  # Glob pattern for require-able path suffixes.

  def self.suffix_pattern
    @suffix_pattern ||= "{#{suffixes.join(',')}}"
  end

  def self.loaded_path? path
    # TODO: ruby needs a feature to let us query what's loaded in 1.8 and 1.9
    re = /(^|\/)#{Regexp.escape path}#{Regexp.union(*Gem.suffixes)}$/
    $LOADED_FEATURES.any? { |s| s =~ re }
  end

  ##
  # Suffixes for require-able paths.

  def self.suffixes
    @suffixes ||= ['',
                   '.rb',
                   *%w(DLEXT DLEXT2).map { |key|
                     val = RbConfig::CONFIG[key]
                     next unless val and not val.empty?
                     ".#{val}"
                   }
                  ].compact.uniq
  end

  ##
  # Prints the amount of time the supplied block takes to run using the debug
  # UI output.

  def self.time(msg, width = 0, display = Gem.configuration.verbose)
    now = Time.now

    value = yield

    elapsed = Time.now - now

    ui.say "%2$*1$s: %3$3.3fs" % [-width, msg, elapsed] if display

    value
  end

  ##
  # Lazily loads DefaultUserInteraction and returns the default UI.

  def self.ui
    require 'rubygems/user_interaction'

    Gem::DefaultUserInteraction.ui
  end

  ##
  # Use the +home+ and +paths+ values for Gem.dir and Gem.path.  Used mainly
  # by the unit tests to provide environment isolation.

  def self.use_paths(home, *paths)
    paths = nil if paths == [nil]
    paths = paths.first if Array === Array(paths).first
    self.paths = { "GEM_HOME" => home, "GEM_PATH" => paths }
    # TODO: self.paths = home, paths
  end

  ##
  # The home directory for the user.

  def self.user_home
    @user_home ||= find_home
  end

  ##
  # Is this a windows platform?

  def self.win_platform?
    if @@win_platform.nil? then
      @@win_platform = !!WIN_PATTERNS.find { |r| RUBY_PLATFORM =~ r }
    end

    @@win_platform
  end

  ##
  # Load +plugins+ as ruby files

  def self.load_plugin_files(plugins)
    plugins.each do |plugin|

      # Skip older versions of the GemCutter plugin: Its commands are in
      # RubyGems proper now.

      next if plugin =~ /gemcutter-0\.[0-3]/

      begin
        load plugin
      rescue ::Exception => e
        details = "#{plugin.inspect}: #{e.message} (#{e.class})"
        warn "Error loading RubyGems plugin #{details}"
      end
    end
  end

  ##
  # Find all 'rubygems_plugin' files in installed gems and load them

  def self.load_plugins
    load_plugin_files find_files('rubygems_plugin', false)
  end

  ##
  # Find all 'rubygems_plugin' files in $LOAD_PATH and load them

  def self.load_env_plugins
    path = "rubygems_plugin"

    files = []
    $LOAD_PATH.each do |load_path|
      globbed = Dir["#{File.expand_path path, load_path}#{Gem.suffix_pattern}"]

      globbed.each do |load_path_file|
        files << load_path_file if File.file?(load_path_file.untaint)
      end
    end

    load_plugin_files files
  end

  class << self

    ##
    # Hash of loaded Gem::Specification keyed by name

    attr_reader :loaded_specs

    ##
    # The list of hooks to be run before Gem::Install#install finishes
    # installation

    attr_reader :post_build_hooks

    ##
    # The list of hooks to be run before Gem::Install#install does any work

    attr_reader :post_install_hooks

    ##
    # The list of hooks to be run after Gem::Specification.reset is run.

    attr_reader :post_reset_hooks

    ##
    # The list of hooks to be run before Gem::Uninstall#uninstall does any
    # work

    attr_reader :post_uninstall_hooks

    ##
    # The list of hooks to be run after Gem::Install#install is finished

    attr_reader :pre_install_hooks

    ##
    # The list of hooks to be run before Gem::Specification.reset is run.

    attr_reader :pre_reset_hooks

    ##
    # The list of hooks to be run after Gem::Uninstall#uninstall is finished

    attr_reader :pre_uninstall_hooks
  end

  def self.cache # :nodoc:
    source_index
  end

  ##
  # Location of Marshal quick gemspecs on remote repositories

  MARSHAL_SPEC_DIR = "quick/Marshal.#{Gem.marshal_version}/"

  autoload :Version,         'rubygems/version'
  autoload :Requirement,     'rubygems/requirement'
  autoload :Dependency,      'rubygems/dependency'
  autoload :DependencyList,  'rubygems/dependency_list'
  autoload :GemPathSearcher, 'rubygems/gem_path_searcher'
  autoload :SpecFetcher,     'rubygems/spec_fetcher'
  autoload :Specification,   'rubygems/specification'
  autoload :Cache,           'rubygems/source_index'
  autoload :SourceIndex,     'rubygems/source_index'
  autoload :PathSupport,     'rubygems/path_support'
  autoload :Platform,        'rubygems/platform'
  autoload :Builder,         'rubygems/builder'
  autoload :ConfigFile,      'rubygems/config_file'
end

module Kernel

  remove_method :gem if 'method' == defined? gem # from gem_prelude.rb on 1.9

  ##
  # Use Kernel#gem to activate a specific version of +gem_name+.
  #
  # +requirements+ is a list of version requirements that the
  # specified gem must match, most commonly "= example.version.number".  See
  # Gem::Requirement for how to specify a version requirement.
  #
  # If you will be activating the latest version of a gem, there is no need to
  # call Kernel#gem, Kernel#require will do the right thing for you.
  #
  # Kernel#gem returns true if the gem was activated, otherwise false.  If the
  # gem could not be found, didn't match the version requirements, or a
  # different version was already activated, an exception will be raised.
  #
  # Kernel#gem should be called *before* any require statements (otherwise
  # RubyGems may load a conflicting library version).
  #
  # In older RubyGems versions, the environment variable GEM_SKIP could be
  # used to skip activation of specified gems, for example to test out changes
  # that haven't been installed yet.  Now RubyGems defers to -I and the
  # RUBYLIB environment variable to skip activation of a gem.
  #
  # Example:
  #
  #   GEM_SKIP=libA:libB ruby -I../libA -I../libB ./mycode.rb

  def gem(gem_name, *requirements) # :doc:
    skip_list = (ENV['GEM_SKIP'] || "").split(/:/)
    raise Gem::LoadError, "skipping #{gem_name}" if skip_list.include? gem_name
    spec = Gem::Dependency.new(gem_name, *requirements).to_spec
    spec.activate if spec
  end

  private :gem

end

##
# Return the path to the data directory associated with the named package.  If
# the package is loaded as a gem, return the gem specific data directory.
# Otherwise return a path to the share area as define by
# "#{ConfigMap[:datadir]}/#{package_name}".

def RbConfig.datadir(package_name) # :nodoc:
  warn "#{Gem.location_of_caller.join ':'}:Warning: " \
    "RbConfig.datadir is deprecated and will be removed on or after " \
    "August 2011.  " \
    "Use Gem::datadir."

  require 'rbconfig/datadir'

  Gem.datadir(package_name) || File.join(Gem::ConfigMap[:datadir], package_name)
end

require 'rubygems/exceptions'

gem_preluded = Gem::GEM_PRELUDE_SUCKAGE and defined? Gem
unless gem_preluded then # TODO: remove guard after 1.9.2 dropped
  begin
    ##
    # Defaults the operating system (or packager) wants to provide for RubyGems.

    require 'rubygems/defaults/operating_system'
  rescue LoadError
  end

  if defined?(RUBY_ENGINE) then
    begin
      ##
      # Defaults the ruby implementation wants to provide for RubyGems

      require "rubygems/defaults/#{RUBY_ENGINE}"
    rescue LoadError
    end
  end
end

##
# Enables the require hook for RubyGems.

require 'rubygems/custom_require'

module Gem
  class << self
    extend Gem::Deprecate
    deprecate :activate_dep,          "Specification#activate", 2011,  6
    deprecate :activate_spec,         "Specification#activate", 2011,  6
    deprecate :cache,                 "Gem::source_index",      2011,  8
    deprecate :activate,              "Specification#activate", 2011, 10
    deprecate :all_load_paths,        :none,                    2011, 10
    deprecate :all_partials,          :none,                    2011, 10
    deprecate :latest_load_paths,     :none,                    2011, 10
    deprecate :promote_load_path,     :none,                    2011, 10
    deprecate :available?,       "Specification::find_by_name", 2011, 11
    deprecate :cache_dir,           "Specification#cache_dir",  2011, 11
    deprecate :cache_gem,           "Specification#cache_file", 2011, 11
    deprecate :default_system_source_cache_dir, :none,          2011, 11
    deprecate :default_user_source_cache_dir,   :none,          2011, 11
    deprecate :report_activate_error, :none,                    2011, 11
    deprecate :required_location,     :none,                    2011, 11
    deprecate :searcher,              "Specification",          2011, 11
    deprecate :source_index,          "Specification",          2011, 11
  end
end

redpajama_set_name: RedPajamaGithub


Dr. Meltzer serves as the William P. Timmie Professor and Chair of the Department of Radiology and Imaging Sciences and as the Associate Dean for Research at the Emory University School of Medicine. Her work focuses on applying novel advanced imaging strategies to better understand brain structure-function relationships in normal aging, late-life depression, and Alzheimer's disease. She is also involved in oncologic imaging research and, while at the University of Pittsburgh, oversaw the clinical evaluation of the world's first combined PET/CT scanner. She established the Emory Center for Systems Imaging to broadly support the advance of imaging technologies in basic and translational research, including beta testing of the first human combined MRI/PET scanner. Dr. Meltzer has also served as the Chair of the Neuroradiology Commission and Chair of the Research Commission on the American College of Radiology's Board of Chancellors, President of the Academy of Radiology Research, Trustee of the Radiological Society of North America Foundation, and President of the American Society of Neuroradiology.
On January 6, 2017, a young man pulled a semiautomatic handgun from his checked baggage and shot and killed several passengers in the Fort Lauderdale airport. In the days following the incident, information about erratic behavior and his prior involvement in incidents of domestic abuse emerged.
The US has the highest rates of both gun-related deaths and mass-shooting incidents. In the latest available statistics from the Center for Disease Control and Prevention (CDC), 33,304 people were killed by firearms in 2014. Over the past decade (2007-2016), there have been 16 mass shootings in the US (Mother Jones' Investigation: US Mass Shootings 1982-2016), including several -- at Virginia Tech, an Aurora theatre, the Sandy Hook Elementary School, Charleston's Emanuel African Methodist Episcopal Church, and the Pulse nightclub in Orlando – that drew substantial national attention.
Particularly since Sandy Hook in 2012, public and political attention has focused heavily on mental health reporting. Despite stark disagreements on the gun control, public acceptance of restricting gun access to those with mental health conditions is strong and has resulted in registering people with known psychiatric illness in the national background check system (Kangas and Calver 2014). Initial efforts focused on those involuntarily committed and/or ruled mentally incompetent by the courts, yet several states have pushed to include people voluntarily seeking mental health treatment. Unintended consequences of mental health background checks may include discouraging individuals from seeking psychiatric treatment based on fear of breach of confidentiality or restriction of rights.
While sensible on the surface and potentially comforting to a jittery public, attempts to medicalize gun violence may be fraught with peril. A psychiatric disorder is a poor and non-specific predictor of violent behavior and evidence on whether mental illness increases the risk of violence is mixed (Norko and Baronosky 2005; Glied and Frank 2014). While public officials may be quick to denounce as "deranged" or "mentally ill" a shooter who appears to hold an extreme ideology or perpetrates a hate crime or seemingly senseless mass shooting, such features are not necessarily indicative of a psychiatric diagnosis. Despite epidemiological evidence to the contrary, the majority of Americans believe people with schizophrenia are likely to act violently toward another person (Harvard Mental Health Letter 2011). The assumed causality between mental illness and mass shootings can easily become generalized to be the driving force in all gun-related deaths (Metzl and MacLeish 2015). Gun laws focusing broadly on mental illness may further perpetuate this misconception and amplify the public stigma associated with psychiatric conditions.
A greater understanding of the roles and interplay of such factors as mental health, substance abuse, past displays of violence, social stress, and availability of a firearm could be useful in developing evidence-based gun safety policies. Yet federal research into the many variables associated with gun-related injuries is limited by a 1996 Congressional action barring the CDC and NIH from promoting gun control and slashing funds for the CDC firearm injury prevention program. Restricting resources to an important public health matter is both ethically problematic and may discourage young scientists from focusing on an area of study for which no significant funding exists.
Follman M, Aronsen G, Pan D. US Mass Shootings, 1982-2016: Data from Mother Jones' Investigation. Sept. 24, 2016 found here (accessed January 8, 2017).
Kangas JL, Calvert JD. Ethical Issues in Mental Health Background Checks for Firearm Ownership. Professional Psychology: Research and Practice 2014;45(1):76-83.
Mental Illness and Violence. Harvard Mental Health Letter. Volume 27, no. 27, January 2011.
Wintemute GJ, Betz ME, Ranney ML. Yes, You Can: Physicians, Patients and Firearms. Annals of Internal Medicine. 2016 165(3): 205-213.
Glied S, Frank RG. Mental Illness and Violence: Lessons From the Evidence. American Journal of Public Health 2014, Vol. 104, No. 2, pp. e5-e6.


text:
Zoa Sherburne (30 September 1912 –  10 October 1995) was an American author, most known for her young adult fiction.

Early life
Sherburne was born in Seattle, Washington and began writing in elementary school. At 10, she started writing poetry.  Her local newspaper, the Ballard Tribune, published a column of her poetry called "The Gremlin's Say." She started writing short stories, poems, and plays.

Career
Sherburne went on to be a very prolific writer, publishing over 300 short stories in magazines. In the 1950s, upon her agent's suggestion, she began writing books as they noticed that short stories began to be less-published due to television's rising popularity.  She went on to publish thirteen novels, which together have been translated into over 27 languages. One of her books, Stranger in the House, about a family dealing with the return of their mother from a mental institution, became a movie: Memories Never Die (1982). Her novels often dealt with girls in difficult circumstances: coping with a mother's alcoholism (Jennifer), with the remarriage of a parent (Almost April and The Girl in the Mirror), with an unexpected pregnancy (Too Bad About the Haines Girl), with guilt over a hit-and-run (Leslie). In her time slip story Why Have the Birds Stopped Singing? the stigma of epilepsy is added to the usual cultural disorientation, and in her paranormal tale The Girl Who Knew Tomorrow, the young psychic girl finds fame a mixed blessing. For Jennifer, she received the Children's Book Award for 1959.

Awards
 1959, Children's Book Award

Published works
 Almost April (1956)
 The High White Wall (1957)
 Princess in Denim (1958)
 Jennifer (1959)
 Stranger in the House (1963)
 Ballerina on Skates (1964)
 River at Her Feet (1965)
 Girl in the Mirror (1966)
 Too Bad About the Haines Girl (1967)
 The Girl Who Knew Tomorrow (1970)
 Leslie (1972)
 Why Have the Birds Stopped Singing? (1974)
 Girl in the Shadows (1975)

References

External links

1912 births
1995 deaths
American women short story writers
American young adult novelists
Women writers of young adult literature
20th-century American short story writers
20th-century American women writers
Writers from Seattle
Novelists from Washington (state)

redpajama_set_name: RedPajamaWikipedia


text:
This 155k-Mile Renault Avantime's Moose Test Goes Surprisingly Well
Km77's latest moose test involves something a little older, but that doesn't stop it from getting some decent results
The moose test can be a struggle for modern cars, even performance-focused ones. You might think, then, that a nearly 20-year-old Renault Avantime is going to be all over the place.
To make matters worse for this example of the stylish but ageing coupe/MPV mash-up tested by Spanish publication Km77.com as part of its '77retros' series, it's done over 150,000 miles and sits on budget/lower-midrange tyres. We have Kumho Ecsta LE Sports on the front, and Wanli S-1063s on the back. They're not exactly fresh, either.
Push a little further, and the Avantime gets a slidey
However, the Avantime performed surprisingly well, putting a lot of modern cars to shame. It breezes through at 69kmh (43mph), and only just fails over 70kmh. At 75kmh the Renault started to get unruly, oversteering and clipping multiple cones on the outside of the exit gate. Not wishing to push their luck with a car that presumably needs to go back to its owner after, the moose test was ended there, just shy of the usual 77kmh target.
It will have helped massively that the Avantime was treated to fresh shock absorbers about 25,000 miles ago, but we shouldn't let that detract from the result. The fact is, Renault (and Matra) managed to make a comfort-focused car that's still happy to get out of its own way when it needs to while outperforming stuff built two decades later.
The 1,700kg Avantime is described as (translated from Spanish) "a bit of a boat" in the slalom test, but it still changes direction fairly tidily.
Now if you'll excuse us, we're off to the classifieds to look at Avantimes.
More Renault posts
Recommended Used Cars What It's Like Driving A £500 Ford Focus Millennium Edition For Two Months Car Throttle Submit Your Videos To Get Featured On Our Social Channels Used Cars Someone's Put An FD RX-7 Butt On A Mazda MX-5 And We Have Questions Used Cars This Isuzu Impulse RS Turbo Is An Obscure But Brilliant 90s Sports Car Purchase Used Cars The Honda Civic Type R Mugen 200 Is (Almost) Peak FN2 Used Cars Limited Parking In Your Area? You Need This Mini 'Shorty' Used Cars Relive DTM's Glory Years With A Jagermeister-Liveried Alfa Romeo 155 V6 TI Used Cars I Bought A Stupidly Rare Manual BMW X5, And It's A Far Better Car Than I'd Anticipated Used Cars I Bought A Porsche Boxster For Under £5,000 And So Far, So Good Used Cars Buy A Mercedes SL63 AMG For VW Golf R Money And Feel Like A Winner

redpajama_set_name: RedPajamaCommonCrawl


Educational Goal: Fundamental knowledge, special (pair) therapy/consultation, development of an anamnesis, compilation of a (differential) diagnosis, referral and consultation skills.
Application fee € 120,--. The application fee is part of the course fee.
Course costs are to be paid in full before the course begins.
Data of our bank account: here.
Thematically concentrated personal experience and Balint groups begin with the curriculum.


text:
Zoltán Csizmadia (born 12 December 1977) is a Hungarian judoka.

Achievements

References

1977 births
Living people
Hungarian male judoka
21st-century Hungarian people


LG Electronics posted its Q3 2017 financial results and the trends from Q1 and Q2 2017 earning releases continue. The company keeps going strong, mainly thanks to the Home Appliance & Air Solution divisions, but the mobile communications branch is still unable to turn a profit. The company posted revenue of KRW15.22 trillion (USD$13.44 billion), which is a 15% increase from Q3 2016. The operating income almost doubled to KRW516.1 billion (USD$455.7 million).
Mobile Communications posted revenue of KRW2.81 trillion (USD$2.48 billion). This results in an 8% increase over Q3 2016 and 4% higher than the April-June period of this year. The money comes mostly from the sales of the G6 flagship, along with some mid-tier devices like the LG Q6 and the LG K-series.
For a second consecutive quarter, the mobile business posted an operating loss, this time KRW375.3 billion (USD$331.37 million). It is the worst operating result of all four LG divisions, but at least it's not as bad as Q3 2016 when the loss was 13% worse or around KRW425 billion (USD$377 million). In the following quarter, LG says it will focus on the LG V30 and will increase sales of both the cameraphone and the mid-tier LG Q6. The company also optimized manufacturing profits and thus expects better results in Q4 2017.
The leader is once again the Home Appliance & Air Solution division. It accounted for one-third of the revenue – KRW4.98 trillion (USD$4.4 billion), which is a 16% increase YoY. Operating income also grew massively – 26% YoY.


Dodge Charger 1970 Wallpaper Best car picture and wallpaper collection . Dodge Charger 1970 Wallpaper free Download . Car Dodge Charger 1970 Wallpapers for desktop and mobile devices for you .
McLaren 570S Wallpaper for desktop Best Sport Car Wallpaper,Image,Picture. McLaren 570S Wallpaper for desktop Free Download . McLaren 570S Picture,Images for desktop background. High quality Pictures of McLaren 570S..
Exotic Car Backgrounds Picture Best Car Wallpaper Collection . Exotic Car Backgrounds Picture .Download Exotic Car Picture,Image,Wallpaper Free.Wallpaper Free Download Exotic Car .Best Car Wallpaper,Picture , Image.


The stunning waterfall is one of the most popular attractions in the country. Located in the canyon, which forms three step terraces, river Hvítá plunges creating a powerful stream and Gullfoss. There are no rails, just a natural surroundings. It is a thrilling and exciting experience. On a side note: the plunge is stronger in summer. If you do not have the luxury of having your own car, make sure to join the Iceland Golden circle tour, which always visits Gullfoss Waterfall.
This unique church is situated in the middle of Reykjavík, the capitol city. It is the tallest and most recognizable building in the country. The architecture was inspired by the Black Falls, another Icelandic natural wonder. At the top of the church there is a wonderful panorama of the city, so make sure to bring your camera.
Iceland is a country literally covered in ice and snow. The overwhelmingly beautiful ice caves attract adventurers from all over the world. The travel agencies organize trips to the glaciers, from where the caves can be visited. The best time to go is In winter, when the ice does not melt and it is safe to enter. The blue ice caves are unique to Iceland and are extremely popular with professional photographers.
From the middle of September to the middle April, you can see the northern phenomena known as the Aurora Borealis. It is amongst the most popular attractions in Iceland. The dazzling lights are especially bright, since the increase of solar activity. The lights are best admired in the remote places, further from the urban lights.
This Geothermal spa offers the most relaxing natural bathing and is the most tempting attraction, found only 40 minutes away from Reykjavík. The water from the underground hot springs reaches 37–39 °C and is beneficial for health and skin. I recommend going right before your flight home.
Due to the volcanic activities underneath the surface, a lot of geysers, underground springs, and thermal pools are scattered all around the country. To see a powerful hot stream shooting from the ground is as cool as it gets. Strokkur in the southwest of Iceland, beside the Hvítá River, is a popular fountain geyser. Many geysers are found in Haukadalur in the south of the country.
The gentle marine giants can be seen from the different locations in the country including Reykjavík. Several companies organize the 2-3 hour whale watching tours. From May to September the whales are out in full force.
Iceland is an extraordinary country with so many natural wonders, thus why not make your next trip and Iceland vacation? I highly recommend you rent a car, in order to experience everything on your Bucket List, just remember to hire a car accident lawyer if for any reason you get into an accident. Guide to Iceland has the largest selection of tours in the country, so make sure to check them out while booking your trip. Get ready for the adventure of your life and please let me know if you spot an elf!
Summer In Iceland? Yes Please!


text:
Earth Day Special Feature – Celebrating Women Innovators in Agtech with Amy Wu, Founder of "From Farms to Incubators"
Celebrating Women Innovators in Agtech
By Amy Wu
Amy Wu, Founder of "From Farms to Incubators"
New York – From Farms to Incubators: Women Innovators Revolutionizing How Our Food Is Grown, is a collection of visual and written portraits of nearly 30 women leaders and innovators in agtech. The book takes an exciting look at how women entrepreneurs are revolutionizing agriculture through high technology including artificial intelligence, sophisticated soil sensors, blockchain, and robotics. These business cases demonstrate the influence of female innovation, the new technologies applied to agribusiness problems, and the career opportunities young women can find in agribusiness. Enjoy the excerpt below.
To get the book click here or learn more about the book and initiative go here. – Amy Wu, April 2021
Mariana Vasconcelos
A Daughter of Farmers Creates Smart Software to Boost Crop Production
In early spring of 2020 Mariana Vasconcelos found herself at a crossroads. With the COVID-19 pandemic spreading globally, the CEO of agtech start-up Agrosmart had to decide whether to cut costs, including staff. The timing seemed uncanny, if not potentially devastating, for in the growing landscape of start-ups, Agrosmart is a rising star.
Agrosmart monitors crops and provides farmers and the entire food supply chain with agronomic and traceability insights. Headquartered in Brazil, the company uses data acquired from sensors installed on farms to monitor crops, with the goal of boosting crop production. The company's mission is to "make agriculture more productive, sustainable, and resilient to climate change." Vasconcelos grew up in a farming family and says that she is driven by wanting to help all farmers be more efficient and increase their yield.
The company has built itself up to nearly sixty staff and to date has raised $8.8 million. Vasconcelos, despite her youthful façade, is a dynamic presence and an engaging and passionate speaker. In 2020 she was included in Worth magazine's list of Groundbreaking Women of the Year.
Vasconcelo's personal history inspired her to launch Agrosmart.
Mariana Vasconcelos, Co-founder and CEO at Agrosmart
She is the daughter of farmers and when younger witnessed the problems they faced. The family farm in Pedralva, Brazil, centered on sugarcane (Brazil is the world's largest exporter of sugarcane) and in recent years shifted to corn and horse breeding; her brother continues to grow organic vegetables and coffee. In this challenging profession, the fragile line between success and failure during a growing season was heavily dependent on Mother Nature and a grower's intuition.
She is a staunch believer that innovation, specifically digital agriculture, is an essential tool in helping farmers—especially small- and midsize producers. It was the growing problems related to climate change "that made me want to bring technology to farmers so they could be more resilient," she says.
With that in mind, Vasconcelos made the decision to maintain as many staff as possible during COVID-19. She also cut the price of her company's products to make them more affordable for small farmers. "We are keeping a full team to support the farmers to keep producing, no matter what, and we have reduced our prices so farmers can access technology," she says.
Even during the pandemic, interest and demand for Agrosmart have seen an uptick as farmers turn to technology as a solution to cutting costs and increasing yield.
Vasconcelos observes: "Farmers are looking for more technology and need more technology in order to be able to understand what has been going on in the field, especially with the lack of labor. . . . They have to keep workers very focused and isolated [social distancing] as much as possible. We also have very limited imports and transportation is very limited."
Merging Passions
Despite growing up on a farm, Vasconcelos had little interest in a career in agriculture, much less returning to or running the family farm, which her father started before she was born (her mother, now retired, was a schoolteacher).
"I was not very interested in farming and I really didn't want to stay on the farm," she says. In a 2017 Financial Times article she admitted, "I thought it was very boring. I liked the horses, but I did not like the farming."
When Vasconcelos was 16 her father handed her the keys to the family bakery, which her grandfather started, hopeful that she'd learn how to run it in case he passed away at an early age as his father had. The bakery was in many ways a companion to the family farm, inspired by a farm-to-table vision of offering coffee and fresh foods. She would continue to run the bakery until Agrosmart took off.
After high school she studied business at the Federal University of Itajubá, a region about 270 miles outside São Paulo known as Brazil's Silicon Valley. She concentrated her studies on tech companies and start-ups and quickly became interested in an area called the internet of things. Popularly known as IoT, the internet of things refers to a system of internet-connected devices, including sensors that transfer data over a wireless network. She wondered how IoT could play a significant part in improving efficient in a variety of sectors.
"I had a lot of contact with hardware, sensors, and robotics," says Vasconcelos, recalling the frequent tech-related events at her university, including robot war competitions in which business and engineering students were often matched.
After finishing college, she moved to Germany to enter the training program at Robert Bosch GmbH, where she worked in sales within the automotive industry. While at Bosch, she followed the development of IoT technologies to search for a way to use innovation to help a variety of industries.
Upon her return to Brazil she wasted little time in launching her first start-up. She tapped a student from her college days whom she had participated in robot competitions with and in 2012 cofounded SmartApps, a consulting company with a focus on using IoT solutions for a wide range of sectors, from oil to medical to environmental industries. Quickly realizing that the company as constructed was not scalable, they shifted their focus to developing concepts for a scalable company. Mariana and her team created an open source platform where they could connect with other innovators and where developers and engineers could create their own solutions (such as building sensors). They also organized hackathons to incentivize developers to create solutions.
Her realization of the powerful connection between technology and agriculture led to her decision to leave SmartApps and launch a tech company that solely focused on the agriculture market. A year later, in 2014, Vasconcelos, then twenty-three, and two childhood friends, Raphael Garcez Pizzi and Thales Nicoleti, founded Agrosmart, which creates software that uses artificial intelligence to make agricultural predictions based on data from the soil, weather conditions, and the genetic properties of the crop.
Vasconcelos notes she and her cofounders had an edge in that all three have parents who are growers, and they understood the challenges in farming. They shared a common belief that data science was the solution to the roadblocks in food production.
The start-up was fortunate in that it had a ready-made base of operations—the bakery that Vasconcelos continued to run. The team also had a small base of farmers, many of them friends with their parents who had watched them grow up. The growers were eager to help and test the technology and offer feedback, but they were slow to make a commitment when it came to purchasing the product. Vasconcelos believes that age and gender were added barriers to sales and fundraising.
"There were many times that agronomists did not put too much faith in what I was doing; the farmers themselves were very open to receive me and they treated me like a daughter, but they didn't really want to pay me or do business with me," she explains. The solution? "We built a more diverse team with men and more senior people for sales," she says. So far, the mix has worked and led to a rise in sales and investment.
Vasconcelos says the company now monitors more than 3.5 million acres of farmland and works with major corporations, including Coca-Cola, which uses the technology to monitor fruit farms in Espírito Santo, a state in southeastern Brazil.
An advocate
Vasconcelos comes across as someone who is outspoken if not adamant about making a difference in food systems. There's a bit of advocacy interwoven into the company's DNA, and Agrosmart definitely has a voice when it comes to tackling major issues such as sustainability and the environment. Since 2019 the company has been a member of the United Nations Global Compact, a collective of business leaders who uphold UN goals on sustainability.
Vasconcelos herself has gained the limelight in recent years by providing a mix of innovation and novelty as a young entrepreneur in a space dominated by men. In 2018 she made the "Innovators Under 35 Latin America 2018" list of leading young innovators compiled by MIT Technology Review. She's been ranked as part of "Forbes Under 30" and was on Fast Company's "Most Creative" list.
The number of women decision-makers in farming (women producers) was very low when Vasconcelos was a child, but she's seeing more women emerging in the space. "In agtech it seems low and there is still a long way to go, but it's growing," she says, hopeful.
What Can I Do
Contact us with any questions or recommendations for resources related to agtech: amy@farmstoincubators.com.
Hosting a screening of our documentary short "From Farms to Incubators," which introduces women in agtech. View the trailer here https://vimeo.com/274583785.
Hold an event that involves a discussion. We seek like-minded individuals and organizations who wish to co-host events, panels and discussions surrounding women in agtech.
Share our searchable directory of women innovators and entrepreneurs in agtech. If interested email us and we are happy to share the embeddable link. If you know of a woman who should be on the list email us.
Join our mailing lists to find out about upcoming events on this topic at: https://hvfarmhub.org/newsletters/
Read industry publications to keep up with news and opportunities in agtech and agbio.
Be a member of From Farms to Incubators or organizations such as WIA or WITI that provide networking opportunities and community for women in agtech.
Attend industry events whether it be in agtech, agbio or food tech and to take it a step further consider speaking on a panel or joining the conferences planning committee.
Learn more about farming practices used to produce your food (visit farms, talk to farmers, look at product labels etc).
To learn more and connect with Amy please email amy@farmstoincubators.com
Official Website: www.farmstoincubators.com
Facebook: https://www.facebook.com/FarmstoIncubators/
Amy Wu is an award-winning writer for the women's ag and agtech movement. She is theCreator & Chief Content Director of From Farms to Incubators. In 2021 she was named by Food Tank as one of "27 Inspiring Women Reshaping the Food System."
She earned her master's degree in journalism from Columbia University.
Ernesto Altamirano April 22, 2021
Previous Previous post: The Rita Moreno California High School Musical Honors announces the 2021 nominees who will virtually compete on Monday, May 24, 2021
Next Next post: Artículo Especial del Día de la Tierra – Celebrando a las Mujeres Innovadoras en la Industria de la Agrotecnología con Amy Wu, Fundadora de "From Farms to Incubators"


text:
55 Things Divers Born After 1985 Won't Understand
You are here: Home / SDI Blog / 55 Things Divers Born After 1985 Won't Understand
by: Brian Carney
A typical day at SDI/TDI/ERDI Headquarters consists of lots of emails, phone calls and, of course, meetings. Over the years these meetings have gone through a lot of different topics and formats, but what happened last week was something I was not expecting … yet. Generally, in a Marketing meeting we throw around topic ideas for different things we feel would make for great content. In this particular meeting I found myself listening and then ultimately being asked to write about a topic because I was the most qualified due to my age! Let that sit for a minute… my age. When did I become the guy old enough to know about something? How did that happen? Well, after I got over that small issue, we started discussing the topic of difficulty people of my age or older (43 for those of you counting) have relating to the generation of Millennials. Take it from me, as I am reminded of it every day at the office, they think and act differently than we do.
This article is the first of three that will address the differences in generations in the industry: Things divers born after 1985 will not understand. A presentation at DEMA titled Inside the Millennial Mind – How to connect with #Millennials to increase business, presented by Lauren Kieren (Millennial) and myself (old guy). Finally an article by Lauren titled, Things divers born before 1985 will never understand.
Just so I could have some additional insight into this topic I consulted a few other "old guys" for help. Dan Orr, Harry Averill, and also Bret Gilliam were kind enough to send me their thoughts on this topic for which I am grateful for their input.
The name of the first electronic dive computer, the EDGE, was actually an acronym for "Electronic Dive GuidE" – Dan Orr would know as he named it.
CO 2 cartridges were standard equipment for BCD's. In early models of BCD's it was standard equipment to have a CO2 cartridge with a mechanism designed to fill the BCD in an emergency situation to provide buoyancy. After years of questionable results such as random trigger of inflation at times when it was not needed or also not working when it was needed, or being a pain to maintain due to corrosion, they fell out of favor. There was a time when it was impossible to find a buoyancy device without a CO2 cartridge
Purge valves on masks were mainstream. In the early 70s purge valves were introduced as a feature on the front of masks.
Octopus regulators were not mandatory.
Pressure gauges were not mandatory, instead divers relied on J valves. SPGs were mandated around 1977 by all training agencies.
A Horse Collar BCD was the only option for a BCD. There were numerous options beginning in 1973 including the At-Pac and Scubapro Back Mounted BC called a Buoyancy Compensating Pack or BCP. In 1977 Scubapro introduced the Stabilizing Jacket that changed everything to this style for most divers.
Back inflation BCDs started long before technical diving
SOS Decompression Meter – Dive computer (aka Bend-O-Matic) was actually sold as a dive computer but had no electronic parts, instead it operated mechanically.
Cave divers got their gear from the hardware store.
Dive gear only came in men's sizes; women's sizes were introduced around 1979 for such gear as wet suits and BCDs.
Technical diving had not started yet. Or more appropriately, the term Technical Diving had not been coined yet.
You could have dive gear in any color as long as it was black.
You could buy a wet suit in a kit and put it together yourself… hopefully.
If you wore a buoyancy device of any kind, other divers wondered if you were scared or couldn't swim.
Buoyancy devices came with a crotch strap.
Divers were suspicious of single hose regulators and would sometimes be heard saying, "Can you really get enough air through that small hose?"
Some divers actually wore pantyhose in order to help them get the early wetsuits on.
At one time, it took lung power to inflate a buoyancy device.
You had to roll over on your back to let air out of your buoyancy device.
It was a life vest before it was a buoyancy compensator.
If you took the original 71.2 cu. ft. aluminum cylinder off under water, it would reach the surface before you.
You had to thread your shoulder straps properly to allow for quick release.
You had to constantly check your "J" valve to make sure it wasn't accidentally pulled down.
Divers would look at your tank valve and try to figure out if it actually looks like a "K" or "J".
When the Totes Company actually made dry suits.
When you had to learn about 'suit squeeze' before dry suits had variable volume capability.
When dive knives were longer than your snorkel
To protect yourself from denizens of the deep, you carried a shark billy or a Faralon Shark Dart.
When you didn't have to be a duck to wear 'duck feet'.
When you cave divers were just as likely to find a car inner tube in their 'wings' as their automobile (Note: the first pair of wings I used actually had an automobile inner tube as a bladder). The very first cave-diving BCs were actually Clorox bottles.
When your dive light could probably double as an aircraft landing light.
You had to decide to keep or remove the neck strap from your regulator 2nd stage.
You had to get into your dry suit through the crotch.
You could buy weights shaped like hand grenades.
You inflated your buoyancy device with a separate air bottle attached to the bottom.
You could choose any breathing gas as long as it was air.
Sportsways, Healthways, Voit, Parkway, Harvey's, Swimaster, Nemrod, Imperial, Dacor were part of every diver's vocabulary
If someone asked you, "Are You A Turtle?", you'd have to answer, "You bet your sweet a** I am!" or you'd owe them a drink. (Comment: This was the marketing campaign by Imperial to promote their Imperial Turtle wet suits)
Nitrox and mixed gas didn't exist for the recreational diver
Sonic alerts, e.g. DiveAlert
Use of oxygen for decompression
Split fins – what are those?
Integrated weight system consisted of a belt with lead on it.
There was no mandatory insurance for dive instructors
IANTD, TDI, ANDI, IDEA, MDEA, ACUC, RSTC were not created yet.
There were very few liveaboard dive vessels and those only traveled to a limited selection of areas.
Most wet suits were nylon-lined, but had textured neoprene on the outside.
No cylinders larger than 80 cubic feet were available.
Dual valve manifolds were not available, instead diving with independent doubles was the only choice.
No Spare Air devices
There was no color film faster than 200 ASA
Portable recompression chambers were the size of a Semi Truck.
No such thing as a referral programs to complete open water training in another location by another instructor
Solo diving was actually what you learned how to do in your Open Water Instructor course
In the span of ten years (approximately 1975 to 1985), items such as alternate-air-source second stages, power inflators, tank-integrated BCs and instrument consoles had gone from being a rarity to being the norm. This is the greatest amount of change in diving equipment in a short period of time that has ever happened. A 1985 diver would look more like one of today's divers, some 30 years later, than he would look like a diver from ten years earlier.
As with any list, we are sure to hear of more items that we missed and encourage our readers to add to it. The one big thing to come out of these articles and presentations is that the industry has come a long way due to innovation and passion from the people within it. Now is the time to start looking to the next generation and tap into their passion, we just need to find a way to communicate with them.
Skills Workshop: Hovering Neutrally Buoyant
https://www.tdisdi.com/wp-content/uploads/2021/01/Hovering-Neutrally-Buoyant_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2021-01-05 13:43:002021-01-05 13:43:00Skills Workshop: Hovering Neutrally Buoyant
Do Not Condemn a Good Cylinder
https://www.tdisdi.com/wp-content/uploads/2020/12/Do-not-condemn-a-good-cylinder_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-12-01 10:57:102020-12-01 10:57:10Do Not Condemn a Good Cylinder
The Recipe for the Perfect Dive
https://www.tdisdi.com/wp-content/uploads/2020/12/Copy-of-Copy-of-Pink-Fruit-Smoothies-Recipe_Food-Ad-Poster-2.png 628 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-12-01 10:32:072020-12-02 09:35:00The Recipe for the Perfect Dive
Does Scuba Diving Affect Mental Health
https://www.tdisdi.com/wp-content/uploads/2020/10/Does-Scuba-Diving-Affect-Mental-Health_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-10-30 13:56:462020-10-30 13:56:46Does Scuba Diving Affect Mental Health
Don't Forget Your Roots
https://www.tdisdi.com/wp-content/uploads/2020/10/Dont-Forget-Your-Roots_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-10-30 12:31:352020-11-04 11:03:16Don't Forget Your Roots
How to become a traveling diver: A step-by-step guide
https://www.tdisdi.com/wp-content/uploads/2020/09/How-to-become-a-traveling-diver_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-09-29 13:30:342020-09-29 13:30:34How to become a traveling diver: A step-by-step guide
The 6 Best Destinations for Newly Certified Divers
https://www.tdisdi.com/wp-content/uploads/2020/09/6-Best-Destinations-for-Newly-Certified-Divers_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-09-29 13:05:302020-10-13 10:42:00The 6 Best Destinations for Newly Certified Divers
How to be a Good Buddy
https://www.tdisdi.com/wp-content/uploads/2020/09/How-to-be-a-Good-Buddy_FB.jpg 627 1200 Brittany Bozik https://www.tdisdi.com/wp-content/uploads/2019/07/header-web-live.png Brittany Bozik2020-09-01 10:26:402020-09-01 10:26:40How to be a Good Buddy
Matt Eker says:
8: Before my time, but people i have dived with called the SOS a "Dial-a-bend" and would tap it on the gunwhale of the boat if they deemed it wasn't "clear" enough for the next dive!
Richard Taylor says:
Brilliant! Still have the Edge, DecoMeter, Horse Collar BCD & Twin Hose!
Add a couple more though:
#56. Deco Tables were USN, DCIEM or Buhlmann. Custom tables were bought one at a time from Dr Bill Hamilton (DCAP) until Sheck Exley's DrX was released (and then tweaked manually ,based upon the outcomes)!
#57. Buddy Breathing was considered a mandatory skill at Open Water level!
alien says:
Our deco tables were US Navy tables under FAUI
Rick McNulty says:
Having first been introduced to the wonders of the underwater world as a necessity to my career work servicing swimming pools back in 1978, you are most correct that the changes made at that time were fast and furious all the way through the early 1990's. All of the technologies being developed at that time fueled my passion for all things underwater which led to my becoming an instructor myself. My instructor mentors used pieces of the older equipment as visual examples of where diving equipment design had started and the advancements that were being developed. It was exciting to be certified by Dick Rutkowski and Bret Gilliam of IAND (IANTD) as a NITROX instructor at the first tech diving instructor course here in Chicago back in 1992. This was at a time when the use of NITROX was not accepted by some of the major dive agencies because it was deemed too technical and not for recreational diving. Fortunately, that is not the case today. It is my hope that the current generation of Millennials will continue to develop exciting and safe new ways to enjoy the underwater world. Clear skies and calm seas, Rick McNulty NAUI #14304L IANTD #177 TDI #257
David Cunningham says:
Great article, reminds me of old times.
The lowest certification level, now Open Water, was "SCUBA Diver", required 40+ hours of training and 6 dives.
The "Open Water" course might include solo high current no visibility dives with line tenders, 3/4 mile hikes with full gear to the dive site, and navigation dive evaluations with lengths over 1/4 mile.
SCUBA tank purchases frequently included free air fills for life.
All divers knew how to use dive tables and did. Most divers knew how to calculate SAC and use it to plan dives.
No one knew you could not dive deeper than 218 FSW on air.
Really cool divers like E.D. dove Andrea Doria with double 72's and no BC.
You could NOT miss Jacques Cousteau or Sea Hunt on TV.
Mahalo for bringing up some great memories.
Oh you forgot that often dive courses were actual commercial dive certifications – i was surprised to get a 5 year ticket back in 1976.
A Scuba dive course was was 1216 week event : 1 night a week theory and 1-2days a week in the water.
It involved everything you needed to do to 120′ including mandatory deco diving, it included a full first aid course, rescue, night diving…everything. I am amusing myself now doing the modern TDI courses in 2015.
The dive instructor would make you swim without "flippers" with all your gear on and no BC to ensure you had buoyancy correct. No BC's were allowed during the courses.
Tobacco tins made good weight moulds.
Buddy breathing on 1 regulator….. the list goes on.
12 to 16 weeks not 1216 weeks
Rob Bradish says:
Would almost be funny, had I not lived t!
My first bouyancy device was a split 1/2 of an airline life vest our girl fiend stews stole for us from the air lines they worked for, co2 cylinders included. 1970's
David Bunch says:
Nice. Fond memories and some gear is still adequate. (my skinny dipper with its big numbers., and my trusty J valves.j
The first diver safety device was a two cartridge tube worn around the waist that formed a ball in front to float the diver when the cartridges were detonated
The 120 rule to remember the no decompression limits from 60 to one hundred feet. (if you used 20 instead of 25 for the 100 ft depth.
The original US Navy ascent rate ( for submarine escape crews) was 25 feet per minute. WWII UDT divers wanted 100 ft per minute and a compromise was made which became standard at 60 ft per minute.
No safety stops until later.
Frank Johanson says:
When I started diving, 1962 (age 14), the tanks were held on with canvas straps (I still have my U. S. Divers original steel tank and double hose regulator). The buoyancy compensatory was "drop your weight belt". We were up-to-date, we had "J" valves. Our dive computers were human brains. We memorized the charts for the dive. Today's dive computers are too small to read, so we still have to memorize the charts. The dive computer is there to keep the boat captain happy. I still use Voodoo gas at age 67. You have a fancy name for it called No-Ox. In reality, it has extra OX, not none! Diving knives were U.S. Army bayonets. I did have to get a new wetsuit as mine finally fell apart. I still like the wing for a "BC". Your wrap around BC jackets are like dragging a parachute behind you, underwater. My Best to All. I might join the present and get a new tank.
Tony Howard says:
Just as a response to the above, whilst many points are valid, there is a HUGE US bias to the points listed and some of the terminology is only used in the US.
Point 3: UK divers only rarely had masks with purge valves. The most common masks were the basic single oval lens rubber mask with steel compression band.
Point 5: very few UK dives used 'J' valves or any valve with a reserve lever. We commenced the use of SPG's much earlier than in the US.
Point 6: The use of basic lifejackets was superceded by the ABLJ, (Adjustable Buoyancy Life Jacket) , in the 70's, with the the most common brands being the Fenzy and Atlantic from La Spirotechnique , others were also made by Buddy. They were nicknamed Horse Collars because of their design.
Point 15: They still do (on most wings and backplates).
Point 17: Not in the UK 🙂
Point 18: All divers should still be able to do this. We were also taught how to use the BCD as an air resource for emergency out of air ascents.
Point 21: Apart from overseas trips to warm water diving, most UK and European divers use steel cylinders not aluminium. N.B. We also don't use the CuFt measurement system, instead our cylinders are designated by volume and pressure, i.e. the most common sizes are 7 litre, 10 litre, 12 litre and 15 litre and in the UK they are filled to 232 BAR (3365 psi).
Steel cylinders are always negatively buoyant, even when empty,
Point 22: Why? Any properly webbed up harness should stay together not fall apart. The most basic harness doesn't even have a shoulder break.
Point 23: Refer to point 5
Point 25: Not sold in the UK
Point: 26: You still have to advise on suit squeeze, it's not disappeared, only that we can now manage and relieve it.
Point 27: Some still are; and BTW, why carry a snorkel (unless of course you are snorkelling not diving).
Point 28: Not in the UK. We carry crab hooks!
Point 29: Not in the UK.
Point 32: Most good divers still have a necklace on their backup 2nd stage.
Point 34: You still can (they're a bit more like mini-hand weights now).
Point 35: Until very recently you could still buy a Buddy (AP Diving) BCD Stab jacket fitted with an emergency air inflation cylinder (0.3 litre 200 BAR).
Point 37: Apart from Dacor and Nemrod these brand names are mostly unknown in the UK.
Point 42: Split fins are still bloody useless and annoying. The turbulence created is one of the most effective ways of stirring up the silt and creating a zero viz dive for any following diver and you cannot frog-kick with them. They should be banned!
Point 48: Refer to the use of steel in point 21. Originally many divers used modified LPG cylinders and pressure reducing valves, as used for portable gas heaters, in caravans and motorhomes (RV's).
Point 50: "Spare Air"= Spare Death. It should be taken off market. It's a dangerous piece of wasted money. Divers should carry an independent alternative air source comprising of an appropriate 2nd cylinder for the dive fitted with a decent regulator, not a crappy item with bugger all capacity, awful regulator and one that's probably never regularly tested.
Point 51: Not true. I worked in photographic retail from 1975 and faster colour film was available in the professional market and there was always the option to 'push' the ASA by changing the developing and processing times.
That's just my personal comments.
Scott Cragin says:
Snorkels were required equipment with PADI (or at least my PADI instructor).
Tom Karnuta says:
Outstanding article and so true. I've just been sitting here howling. How many unscheduled ascents happened due to that darn CO2 cord getting snagged and pulled by mistake. Well, at least 1. And we thought we were so cool when we started wrapping the collars on our "life vests" with duck tape to give us a bit more clearance.
I can still remember getting my first pressure gauge.
My first certification was YMCA, it says "Skin Diver".
TDI 3884
"IANTD, TDI, ANDI, IDEA, MDEA, ACUC, RSTC were not created yet"
Not strictly true – IANTD was formed in 1985
Actually, this should be titled for people who began diving after 1985 not those who were BORN after 1985. Someone may have been born in 1975 but was not likely diving by 1985.
David Sloan says:
My first Certification was N.A.S.(skin) D.S in Colorado Springs,Colorado in 1974-1975 (also my first Ice Dive…it was very thin ice,an in a wet suit) The Power Inflater was my first up grade Weaver Super Vest. oh.."Dive with your head not your back." The Edge my first dive computer Instructor Model in silver.
*Still Diving* Thank you Very Much
And don't forget what some instructors used to call "Harassment". This was the part of the course where all your gear was placed at the bottom of the deep end of the pool. You as the student would dive in swim down and start to put on your gear, as your instructor ripped it off. What fun!
Also: Head first descents where the norm
And of course, it was OK to put your mask on your forehead, without some bozo 21 year old divemaster giving you grief.
Rusty Barnett says:
Yep! Also, sitting on the bottom in my DM class, passing a single tank around the circle with no regulator, catching breaths by cracking the valve into your cupped hand… 🙂
Peter Le Sueur says:
Octopus rigs were only used by instructors, buddy breathing meant sharing your own regulator and hoping your buddy gave it back after a few breaths! oral inflation or horse collar BCDs etc
Pete Pehl says:
When I took my YMCA scuba course in 1970 we made 1 certification dive and my buddy and I were not with an instructor.
Still have my SOS / Benz-O-Matic in its "egg)" protective case to "keep it in calibration" when traveling on airlines. Also have the over / under speargun named the Doublette manufactured by Arbalette Corp. Fires a spring loaded spear from the center tube and rubber bands launch the top shaft.
In the 50's the prominent (and only ) mask was the Squale imported directly from France to south Florida. Thin walls and fit every face. Also popular was the VOIT Fifty Fathom two hose Regulator.
Don' t recall ever reaching 50 fathoms.
joe hohmann says:
Bart,You really bring back early diving. Can remember using an inner tube as a lift bag. It had a mouth valve for inflation.
Tony Anderson says:
Lots of good memories here. My first "dive suit" was an Army surplus "scuba tote". Dove for 5 years, then got a diver certification via the "NASDS Forgotten Diver" program as a requirement to become an instructor with the YMCA and then PADI. (You also needed to be a YMCA Lifeguard).
The life vest was an actual "May West" surplus inflatable life vest.
Back in the "Good old days" you were a DIVER it wasn't just something you did!
In many ways it is unfortunate that diving has become too politically correct
Tony Alba says:
Great article..
It's became so easy to get certified these days , so much have advance but training should be at top.
David McLean says:
I agree it is a bit US-centric, and its all in fun. I look forward to the Millenial counterpoint to this.
You might enjoy the history of buoyancy compensators – a powerpoint I built a bit ago. The presentation is located here:
https://drive.google.com/drive/u/0/folders/0B3Z4b8qrjCTWSkJWd1N6YW5udTQ
Very interesting piece and having lived through the fifties, sixties and seventies I can relate to many of the points made. However, as a Brit, I agree with Tony Howard that there is too much USA-centricity and too little understanding of what went on in the rest of the world back then. No. 12, The Fordian statement "You could have dive gear in any color as long as it was black" was signally untrue of certain mainstream manufacturers in the earliest days, who produced masks and fins in a variety of colours from the 1950s onwards. You mentioned Ohio-based So-Lo Marx's Totes drysuits, which were available in brown, yellow and green in their time, never in black. In 1959 some manufacturers (notably US Divers) made suits and other gear in "safety yellow." As for "You had to get into your dry suit through the crotch", the earliest drysuits trended to chest entry, neck entry or two-piece garments. And readers of "Some divers actually wore pantyhose in order to help them get the early wetsuits on" may be surprised to know that some modern freedivers use the same technique, having reverted to more body-fitting versions of the old unlined wetsuit.
So be aware that there was still plenty of variety from year to year and from country to country in the pre-1980 world of diving. And just because something is newer doesn't mean it's necessarily better. This said, a stimulating review of the differences between "now" and "then".
Ian Whittaker says:
Sorry Tony Howard but I would disagree with a few of your comments. I started diving in 1968 and it was most certainly Cubic Foot cylinders and many of them were the aluminium Luxfers. The steel bottles e.g. the 40 cf 'Tadpole' and it's bigger brother the 80 cf 'Pig' needed lead backpacks., furthermore my first depth gauge, with the wee bubble in the tube was calibrated in feet. Of the old school I still carry a snorkel, you might plan to dive but if push comes to shove and you end up on the surface with no air it sure helps. In fact, only last year when when a diver in a group on a boat dive went 'missing' on a dive for 45 minutes after he was due on the surface his first words on getting back on the boat was "I'm glad I had my snorkel", he had been heading for shore when we found him. Finally, stockings did help getting into a 3/16″ single skin neoprene wet suit.
ger says:
used oxygen to decompress in the late 70's early 80s on dives in Superior (stern of Emperor, etc). Apparently, from list, this has fallen out of practice. can anyone explain why, point to articles, etc.?
SDI/TDI/ERDI says:
The use of 100% oxygen for decompression has not fallen out of practice. We are sorry if the article caused confusion. Quite the contrary, it is still widely used around the globe for accelerated decompression. It is currently taught in a number of our courses, Advanced Nitrox, Decompression Procedures, Extended Range, Trimix, and Advanced Trimix.
William Savage says:
Mike Nelson and "Sea Hunt" should have been top of the list.
FWIW, when I was taught to dive around 1970 we were told that you couldn't incur a deco obligation on a single tank dive.
Mujaahida Duffy says:
I was styling in 1978 orange and black farmer john, ASA 200, was just special developed as ASA 400…
Remember Diver born before 1985, should not be limited to just a specific decade…. Depending on how old you are is the key to matching the authors examples…lol
John Miller says:
Yelp, used it all as my first c card came from YMCA in Bangor Me 1973 and it is still in my log book along with many others now.
don't agree with # 45. I took A.C.U.C course here in Canada in 1977 and I still have my paper diploma.
Joyce Holmes Steinmetz says:
In 1975, I was certified as a NAUI "Scuba Diver" by D. Lee Kvalnes of First State Sports, Delaware. The course was 40 hours of classroom and pool, 4 hrs/wk x 10 weeks, followed by 2 quarry dives and 2 ocean boat dives. One of the pool skills was the "black-out bail-out." With duct tape on your mask lens, jump in the deep end, sink to the bottom, take off all your gear, stow it carefully, turn off the tank, and place the mask on the pool bottom last. Surface and catch a breath or two. Dive to the bottom, turn on the tank, put on the blacked-out mask, and suit back up. It was a thorough course and I felt very comfortable in the ocean from day 1.
Bob Jensen says:
I did the same in 1986. Was scary and challenging at first, but then I love it. And I agree with you completely. After Lee's training, I was comfortable in the ocean from day one. Thank you for posting. I miss Lee.. 🙁
Turtle Club FAR pre-dates Imperial wetsuits…to at least WWII. My grandfather was a B-24 crewman and had an actual membership card (which I now have) with the induction questions on the back. I am told it got its start in the military aviation community. As for the rest of the lis…thanks! Takes me down memory lane! 🙂
Douglas Truhill says:
I just rankle at the stupidity of "Don't wear your mask on your forehead". My research found that some PADI instructor in the 1990s misinterpreted an instructor manual and began teaching this as a sign of distress. Why it caught on with other instructors is a mystery to me. Not only is it the most natural place to wear it on a smooth surface or the shore, divers had previously been doing so since free and scuba diving began. See any old pictures before this time. I've heard " You'll lose your mask in a surf or rough water situation." You don't wear it there in those situations, FOOL ! I've never lost a mask in over 50 years and over a thousand dives. — Doug
Helmut Meyer says:
In August 1958 (year is correct, no mistake – 59 years ago now) in the Rombakken fjord I made some wreck dives visiting destroyers, sunken during WW II. Because of August north of the polar circle there was midnight sunshine from the north … .The dive equipment – two tanks 7 liters 150 bar connected by high pressure bridge, "Safety Scuba" one stage regulator with double fold tube (as used today with rebreathers) ==>> kindly no bubbles in front. No jacket ==>> harness just naked straps connected with the tanks. Bouyancy by more precise calculated weights at weight belt and a "Klobrille" around neck with 0.5 liter separate tank.. Wet suit … top only, no trouser, no long arms, no hood. Neoprene inside surface open pores – no nylon cover at all, not inside / not outside. You've had to be very careful to get it on and off – it very easy ruptures. After each neoprene glue repair the top became less flexible …
With a good chance in mind only to meet with mermaid Ligäa, daughter of Calliope I definitely would repeat a dive in any fjord with THAT equipment.
Conrad Daubanton says:
Thanks for a very interesting text. Here's my contribution…
In those, early days, Italians were diving, obviously not too deep, with closed circuit oxygen rebreathers. I believe Pirelli was manufacturing them. They were single hose pendular chest mounted units with a small oxygen cylinder under the bag, much like the air cylinders Fenzy BCs had. The civilian rebreather market didn't start in strength until 1995 with Dräger's Atlantis I SCR, later to be revamped as the Dolphin. Now there are many manufacturers especially of ECCR and mCCR (KISS).
I can remember practicing buddy breathing with a twin-hose regulator. The idea was that the out-of-air diver would swim horizontally over the donor, who would take a couple of breaths and then lift the mouthpiece above his head, handing it backwards to the top diver would place the flowing mouthpiece in his mouth, twisting the corrugated hoses a bit, and take a couple of breaths before handing it to the bottom diver's outstretched hand. The bottom diver was hoping the top diver, whom he couldn't see, would be quick in handing back the mouthpiece, and would have to keep air in his lungs to blow away the water that invariably entered the mouthpiece. Unlike rebreathers' mouthpiece which can, and should be closed, before taking them off one's mouth, the regulator's mouthpiece couldn't be closed, however its exhalation hose led to an exhaust valve in the regulator's body on the diver's back where the water was dumped along with the exhaled air. No risk of loop flooding because there was no loop to flood!
The idea was that in this configuration, the divers could swim horizontally to get back to the beach or chain anchor. Strangely enough, when single hose regulators were used, the same method was used, perhaps to keep things simple for the divers. One problem, one answer. Or perhaps the leaders of the local dive teaching body just thought: if it ain't broke, why fix it?
Back then only instructors were allowed to use BCs, as they were considered a dangerous thing because of the risk of an uncontrolled bouyant ascent. So they were not part of the training process. Once you were a certified diver and decided to buy one, it was up to you to figure out how to use the thing!
On the other hand, we did have to learn and perform emergency ascents without regulator, allowing air to leave the airways to avoid burst lung. For my first level instructor exam my examiner (who put on a horse-collar BC but didn't touch it during the dive) and I had to ascend to the surface from 50 metres (165 ft) allowing the air to flow progressively our of my lungs, in what became a chaos of bubbles, only to have him challenge me by saying I'd taken a breath from my regulator on the way up! I had my regulator mouthpiece in my hand, tucked under my chin to avoid ir from free-flowing. Even if I had taken a breath, there's no way he could have seen anything with that wall of bubbles between us. I told him I had done no such thing, but that I'd happily repeat the exercise with him. That satisfied him and then we proceeded, he in a boat, me in the water, with the 2-mile surface swim with 200 bar steel double 10 litre cylinders (we did have Nemrod twin manifolds in Spain). Since backplates still hadn't arrived to the shops, I preferred doubles because the cylinders had shoulder and crotch straps attached to steel bands, and stayed better on one's back than the bigger single15 litre cylinders which tended to move around. Having more than enough air also seemed like a good idea. It was the most boring part of the exam, but when a friend and I had his boat taken by someone who mistook it for an abandoned vessel, and we had a mile or so to swim back to port, having done that 2 mile swim gave me confidence that even if it would take a while, we would be able to get back to port. Fortunately it was not necessary, as just before nightfall a motor yacht which almost run us over, offered us a welcome ride back to dry land.
Conrad Daubanton
TDI 461
gear by poseidon says:
great post thanks for sharing 🙂
great post and site thanks for sharing
Stephan Rose says:
Maybe I missed it but "back when" we didn't dive without an abb iron. lacing D-rings was our safety net.
S. Scott Rose, PADI 5005
Tom Hardy says:
Great article! Brought me right back to 1974 and my PADI scuba diver training here in New Hampshire. Buddy breathing – we had up to 7 (yes 7) people breathing from one regulator in the deep end! 'Doff and don of the gear in the deep end. Instructor was a Navy UDT (now the Seals) gentleman who made sure we were comfortable in the water. Learned and used the dive tables including decompression! Free ascent from 40 feet saltwater out near the Nubble light as part of the checkout dives. Oh, and I still have the mask (sadly not usable) with the front mounted purge valve – I loved using that mask!.
Recently decided to get back in after a few years (decade) away, certified OW with the same PADI diveshop where I originally trained (oldest PADI diveshop still in existance); thrilled to be back in and enjoying the sport again. Thanks again for a great article.
Advanced Adventure Course
sdidivers
Another weekend in the pool and we wouldn't have i
Proud for being apart of SDI Family #SDIflags #Fla
Where are you diving this weekend divers? #SDIflag
Happy #flagFriday divers let's see those #SDIflags
Oh no... it's the night before your next dive and
What type of diver are you? The more color on your
When did you last see a turtle while diving? Tell
Happy #TurtleTuesday divers!  📷 @andyleesurf
New week new courses! These divers are tackling ou
Who did you dive with this weekend? Tag them below
SDI News
Skills Workshop: Hovering Neutrally BuoyantJanuary 5, 2021 - 1:43 pm
Do Not Condemn a Good CylinderDecember 1, 2020 - 10:57 am
The Recipe for the Perfect DiveDecember 1, 2020 - 10:32 am
Does Scuba Diving Affect Mental HealthOctober 30, 2020 - 1:56 pm
Don't Forget Your RootsOctober 30, 2020 - 12:31 pm
How to become a traveling diver: A step-by-step guideSeptember 29, 2020 - 1:30 pm
The 6 Best Destinations for Newly Certified DiversSeptember 29, 2020 - 1:05 pm
How to be a Good BuddySeptember 1, 2020 - 10:26 am
The Scariest Dive Dive Gear: Tips and Benefits of Streamlining


The Fly Fishing Film Tour (F3T) is a one of a kind experience showcasing the best in fly fishing cinema. 2017 marks The F3T's 11th expedition across North America and another incredible lineup of independent films. From Siberia to Idaho, Mexico, Florida, Kamchatka, Alaska, Montana and more, the notable characters, unique storylines and unparalleled fishing in these films will lead you on an adventure around the globe!