text:
<?php

defined( 'ABSPATH' ) || die();

/**
 * Logs plugin installs, updates, and deletions
 */
class SimplePluginLogger extends SimpleLogger {

	/**
	 * The logger slug. Defaulting to the class name is nice and logical I think
	 *
	 * @var string $slug
	 */
	public $slug = __CLASS__;

	/**
	 * This variable is set if a plugins has been disabled due to an error,
	 * like when the plugin file does not exist. We need to store this in this
	 * weird way because there is no other way for us to get the reason.
	 *
	 * @var string $latest_plugin_deactivation_because_of_error_reason
	 */
	public $latest_plugin_deactivation_because_of_error_reason = array();

	/**
	 * Get array with information about this logger
	 *
	 * @return array
	 */
	function getInfo() {

		$arr_info = array(
			'name' => 'Plugin Logger',
			'description' => 'Logs plugin installs, uninstalls and updates',
			'capability' => 'activate_plugins',
			'messages' => array(

				'plugin_activated' => _x(
					'Activated plugin "{plugin_name}"',
					'Plugin was non-silently activated by a user',
					'simple-history'
				),

				'plugin_deactivated' => _x(
					'Deactivated plugin "{plugin_name}"',
					'Plugin was non-silently deactivated by a user',
					'simple-history'
				),

				'plugin_installed' => _x(
					'Installed plugin "{plugin_name}"',
					'Plugin was installed',
					'simple-history'
				),

				'plugin_installed_failed' => _x(
					'Failed to install plugin "{plugin_name}"',
					'Plugin failed to install',
					'simple-history'
				),

				'plugin_updated' => _x(
					'Updated plugin "{plugin_name}" to version {plugin_version} from {plugin_prev_version}',
					'Plugin was updated',
					'simple-history'
				),

				'plugin_update_failed' => _x(
					'Failed to update plugin "{plugin_name}"',
					'Plugin update failed',
					'simple-history'
				),

				'plugin_deleted' => _x(
					'Deleted plugin "{plugin_name}"',
					'Plugin files was deleted',
					'simple-history'
				),

				// Bulk versions.
				'plugin_bulk_updated' => _x(
					'Updated plugin "{plugin_name}" to {plugin_version} from {plugin_prev_version}',
					'Plugin was updated in bulk',
					'simple-history'
				),

				// Plugin disabled due to some error.
				'plugin_disabled_because_error' => _x(
					'Deactivated plugin "{plugin_slug}" because of an error ("{deactivation_reason}").',
					'Plugin was disabled because of an error',
					'simple-history'
				),

			), // Messages.
			'labels' => array(
				'search' => array(
					'label' => _x( 'Plugins', 'Plugin logger: search', 'simple-history' ),
					'label_all' => _x( 'All plugin activity', 'Plugin logger: search', 'simple-history' ),
					'options' => array(
						_x( 'Activated plugins', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_activated'
						),
						_x( 'Deactivated plugins', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_deactivated',
							'plugin_disabled_because_error',
						),
						_x( 'Installed plugins', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_installed'
						),
						_x( 'Failed plugin installs', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_installed_failed'
						),
						_x( 'Updated plugins', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_updated',
							'plugin_bulk_updated',
						),
						_x( 'Failed plugin updates', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_update_failed'
						),
						_x( 'Deleted plugins', 'Plugin logger: search', 'simple-history' ) => array(
							'plugin_deleted'
						),
					),
				), // search array.
			), // labels.
		);

		return $arr_info;

	}

	/**
	 * Plugin loaded
	 */
	public function loaded() {

		/**
		 * At least the plugin bulk upgrades fires this action before upgrade
		 * We use it to fetch the current version of all plugins, before they are upgraded
		 */
		add_filter( 'upgrader_pre_install', array( $this, "save_versions_before_update" ), 10, 2 );

		// Clear our transient after an update is done
		// Removed because something probably changed in core and this was fired earlier than it used to be
		// add_action( 'delete_site_transient_update_plugins', array( $this, "remove_saved_versions" ) );

		// Fires after a plugin has been activated.
		// If a plugin is silently activated (such as during an update),
		// this hook does not fire.
		add_action( 'activated_plugin', array( $this, "on_activated_plugin" ), 10, 2 );

		// Fires after a plugin is deactivated.
		// If a plugin is silently deactivated (such as during an update),
		// this hook does not fire.
		add_action( 'deactivated_plugin', array( $this, "on_deactivated_plugin" ), 10, 2 );

		// Fires after the upgrades has done it's thing
		// Check hook extra for upgrader initiator
		add_action( 'upgrader_process_complete', array( $this, "on_upgrader_process_complete" ), 10, 2 );

		// Detect files removed
		add_action( 'setted_transient', array( $this, 'on_setted_transient_for_remove_files' ), 10, 2 );

		add_action("admin_action_delete-selected", array($this, "on_action_delete_selected" ), 10, 1);

		// Ajax function to get info from GitHub repo. Used by "View plugin info"-link for plugin installs
		add_action("wp_ajax_SimplePluginLogger_GetGitHubPluginInfo", array($this, "ajax_GetGitHubPluginInfo"));

		// If the Github Update plugin is not installed we need to get extra fields used by it.
		// So need to hook filter "extra_plugin_headers" ourself.
		add_filter( "extra_plugin_headers", function( $arr_headers ) {
			$arr_headers[] = "GitHub Plugin URI";
			return $arr_headers;
		} );

		// There is no way to use a filter and detect a plugin that is disabled because it can't be found or similar error.
		// So we hook into gettext and look for the usage of the error that is returned when this happens.
		add_filter( 'gettext', array( $this, 'on_gettext_detect_plugin_error_deactivation_reason' ), 10, 3 );
		add_filter( 'gettext', array( $this, 'on_gettext' ), 10, 3 );

	}

	/**
	 * Things
	 *
	 * @param string $translation Translation.
	 * @param string $text Text.
	 * @param string $domain Domin.
	 */
	function on_gettext_detect_plugin_error_deactivation_reason( $translation, $text, $domain ) {

		global $pagenow;

		// We only act on page plugins.php.
		if ( ! isset( $pagenow ) || 'plugins.php' !== $pagenow ) {
			return $translation;
		}

		// We only act if the untranslated text is among the following ones
		// (Literally these, no translation).
		$untranslated_texts = array(
			'Plugin file does not exist.',
			'Invalid plugin path.',
			'The plugin does not have a valid header.',
		);

		if ( ! in_array( $text, $untranslated_texts, true ) ) {
			return $translation;
		}

		// Text was among our wanted texts.
		switch ( $text ) {
			case 'Plugin file does not exist.':
				$this->latest_plugin_deactivation_because_of_error_reason[] = 'file_does_not_exist';
				break;
			case 'Invalid plugin path.':
				$this->latest_plugin_deactivation_because_of_error_reason[] = 'invalid_path';
				break;
			case 'The plugin does not have a valid header.':
				$this->latest_plugin_deactivation_because_of_error_reason[] = 'no_valid_header';
				break;
		}

		return $translation;
	}

	/**
	 * There is no way to use a filter and detect a plugin that is disabled because it can't be found or similar error.
	 * we hook into gettext and look for the usage of the error that is returned when this happens.
	 *
	 * A plugin gets deactivated when plugins.php is visited function validate_active_plugins()
	 * 		return new WP_Error('plugin_not_found', __('Plugin file does not exist.'));
	 * and if invalid plugin is found then this is outputed
	 *  printf(
	 *  /* translators: 1: plugin file 2: error message
	 *  __( 'The plugin %1$s has been deactivated due to an error: %2$s' ),
	 *  '' . esc_html( $plugin_file ) . '',
	 *  $error->get_error_message() );
	 *
	 * @param string $translation Translation.
	 * @param string $text Text.
	 * @param string $domain Domin.
	 */
	function on_gettext( $translation, $text, $domain ) {

		global $pagenow;

		// We only act on page plugins.php.
		if ( ! isset( $pagenow ) || $pagenow !== "plugins.php" ) {
			return $translation;
		}

		// We only act if the untranslated text is among the following ones
		// (Literally these, no translation)
		$untranslated_texts = array(
			// This string is called later than the above
			'The plugin %1$s has been deactivated due to an error: %2$s'
		);

		if ( ! in_array( $text, $untranslated_texts ) ) {
			return $translation;
		}

		// Directly after the string is translated 'esc_html' is called with the plugin name.
		// This is one of the few ways we can get the name of the plugin.
		// The esc_html filter is used pretty much but we make sure we only do our.
		// stuff the first time it's called (directly after the gettet for the plugin disabled-error..).
		$logger_instance = $this;

		add_filter( 'esc_html', function( $safe_text, $text ) use ( $logger_instance ) {
			static $is_called = false;

			if ( false === $is_called ) {
				$is_called = true;

				$deactivation_reason = array_shift( $logger_instance->latest_plugin_deactivation_because_of_error_reason );

				// We don't know what plugin that was that got this error and currently there does not seem to be a way to determine that.
				// So that's why we use such generic log messages.
				$logger_instance->warningMessage(
					'plugin_disabled_because_error',
					array(
						'_initiator' => SimpleLoggerLogInitiators::WORDPRESS,
						'plugin_slug' => $text,
						'deactivation_reason' => $deactivation_reason,
					)
				);
			}

			return $safe_text;
		}, 10, 2 );

		return $translation;

	} // on_gettext

	/**
	 * Show readme from github in a modal win
	 */
	function ajax_GetGitHubPluginInfo() {

		if ( ! current_user_can("install_plugins") ) {
			wp_die( __("You don't have access to this page.", "simple-history" ));
		}

		$repo = isset( $_GET["repo"] ) ? (string) $_GET["repo"] : "";

		if ( ! $repo ) {
			wp_die( __("Could not find GitHub repository.", "simple-history" ));
		}

		$repo_parts = explode("/", rtrim($repo, "/"));
		if ( count($repo_parts) !== 5 ) {
			wp_die( __("Could not find GitHub repository.", "simple-history" ));
		}

		$repo_username = $repo_parts[3];
		$repo_repo = $repo_parts[4];

		// https://developer.github.com/v3/repos/contents/
		// https://api.github.com/repos/<username>/<repo>/readme
		$api_url = sprintf('https://api.github.com/repos/%1$s/%2$s/readme', urlencode( $repo_username ), urlencode( $repo_repo ));

		// Get file. Use accept-header to get file as HTML instead of JSON
		$response = wp_remote_get( $api_url, array(
			"headers" => array(
				"accept" => "application/vnd.github.VERSION.html"
			)
		) );

		$response_body = wp_remote_retrieve_body( $response );

		$repo_info = sprintf(
						__('
Viewing readme from repository %2$s.
', "simple-history"),
						esc_url( $repo ),
						esc_html( $repo )
					);

		$github_markdown_css_path = SIMPLE_HISTORY_PATH . "/css/github-markdown.css";

		printf(
			'
				<!doctype html>

				<base href="%4$s/raw/master/">

					%1$s

					%2$s

			',
			$repo_info,
			$response_body,
			$github_markdown_css_path,
			esc_url( $repo ) // 4
		);

		#echo($response_body);

		exit;

	}

	/*
	 * When a plugin has been deleted there is no way for us to get
	 * the real name of the plugin, only the dir and main index file.
	 * So before a plugin is deleted we save all needed info in a transient
	 */
	function on_action_delete_selected() {

		// Same as in plugins.php
		if ( ! current_user_can('delete_plugins') ) {
			wp_die(__('You do not have sufficient permissions to delete plugins for this site.'));
		}

		// Verify delete must be set
		if ( ! isset( $_POST["verify-delete"] ) || ! $_POST["verify-delete"] ) {
			return;
		}

		// An arr of plugins must be set
		if ( ! isset( $_POST["checked"] ) || ! is_array( $_POST["checked"] ) ) {
			return;
		}

		// If we get this far it looks like a plugin is begin deleted
		// Get and save info about it

		$this->save_versions_before_update();

	}

	/**
	 * Saves info about all installed plugins to an option.
	 * When we are done logging then we remove the option.
	 */
    function save_versions_before_update($bool = null, $hook_extra = null) {

		$plugins = get_plugins();

		// does not work
		$option_name = $this->slug . "_plugin_info_before_update";

		$r = update_option( $option_name, SimpleHistory::json_encode( $plugins ) );

		return $bool;

	}

	/**
	 * Detect plugin being deleted
	 * When WP is done deleting a plugin it sets a transient called plugins_delete_result:
	 * set_transient('plugins_delete_result_' . $user_ID, $delete_result);
	 *
	 * We detect when that transient is set and then we have all info needed to log the plugin delete
	 *
	 */
	public function on_setted_transient_for_remove_files( $transient = "", $value = "" ) {

		if ( ! $user_id = get_current_user_id() ) {
			return;
		}

		$transient_name = '_transient_plugins_delete_result_' . $user_id;
		if ( $transient_name !== $transient ) {
			return;
		}

		// We found the transient we were looking for
		if (
				isset( $_POST["action"] )
				&& "delete-selected" == $_POST["action"]
				&& isset( $_POST["checked"] )
				&& is_array( $_POST["checked"] )
				) {

			/*
		    [checked] => Array
		        (
		            [0] => the-events-calendar/the-events-calendar.php
		        )
		    */

			$plugins_deleted = $_POST["checked"];
			$plugins_before_update = json_decode( get_option( $this->slug . "_plugin_info_before_update", false ), true );

			foreach ( $plugins_deleted as $plugin ) {

				$context = array(
					"plugin" => $plugin // plugin-name-folder/plugin-main-file.php
				);

				if ( is_array( $plugins_before_update ) && isset( $plugins_before_update[ $plugin ] ) ) {
					$context["plugin_name"] = $plugins_before_update[ $plugin ]["Name"];
					$context["plugin_title"] = $plugins_before_update[ $plugin ]["Title"];
					$context["plugin_description"] = $plugins_before_update[ $plugin ]["Description"];
					$context["plugin_author"] = $plugins_before_update[ $plugin ]["Author"];
					$context["plugin_version"] = $plugins_before_update[ $plugin ]["Version"];
					$context["plugin_url"] = $plugins_before_update[ $plugin ]["PluginURI"];
				}

				$this->infoMessage(
					"plugin_deleted",
					$context
				);

			}

		}

		$this->remove_saved_versions();

	}

	/**
	 * Save all plugin information before a plugin is updated or removed.
	 * This way we can know both the old (pre updated/removed) and the current version of the plugin
	 */
	/*public function save_versions_before_update() {

		$current_screen = get_current_screen();
		$request_uri = $_SERVER["SCRIPT_NAME"];

		// Only add option on pages where needed
		$do_store = false;

		if (
				SimpleHistory::ends_with( $request_uri, "/wp-admin/update.php" )
				&& isset( $current_screen->base )
				&& "update" == $current_screen->base
			) {

			// Plugin update screen
			$do_store = true;

		} else if (
				SimpleHistory::ends_with( $request_uri, "/wp-admin/plugins.php" )
				&& isset( $current_screen->base )
				&& "plugins" == $current_screen->base
				&& ( isset( $_POST["action"] ) && "delete-selected" == $_POST["action"] )
			) {

			// Plugin delete screen, during delete
			$do_store = true;

		}

		if ( $do_store ) {
			update_option( $this->slug . "_plugin_info_before_update", SimpleHistory::json_encode( get_plugins() ) );
		}

	}
	*/

	/**
	  * when plugin updates are done wp_clean_plugins_cache() is called,
	  * which in its turn run:
	  * delete_site_transient( 'update_plugins' );
	  * do_action( 'delete_site_transient_' . $transient, $transient );
	  * delete_site_transient_update_plugins
	  */
	public function remove_saved_versions() {

		delete_option( $this->slug . "_plugin_info_before_update" );

	}

	/**
	 * Called when plugins is updated or installed
	 * Called from class-wp-upgrader.php
	 *
	 * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might
	 *                              be a Theme_Upgrader or Core_Upgrade instance.
	 * @param array           $data {
	 *     Array of bulk item update data.
	 *
	 */
	function on_upgrader_process_complete( $plugin_upgrader_instance, $arr_data ) {

		// Can't use get_plugins() here to get version of plugins updated from
		// Tested that, and it will get the new version (and that's the correct answer I guess. but too bad for us..)

		/*
		If an update fails then $plugin_upgrader_instance->skin->result->errors contains something like:
		Array
		(
		    [remove_old_failed] => Array
		        (
		            [0] => Could not remove the old plugin.
		        )

		)
		*/

		/*

		# Contents of $arr_data in different scenarios

		## WordPress core update

		$arr_data:
		Array
		(
		    [action] => update
		    [type] => core
		)

		# Plugin install

		$arr_data:
		Array
		(
		    [type] => plugin
		    [action] => install
		)

		## Plugin update

		$arr_data:
		Array
		(
		    [type] => plugin
		    [action] => install
		)

		## Bulk actions

		array(
			'action' => 'update',
			'type' => 'plugin',
			'bulk' => true,
			'plugins' => $plugins,
		)

		*/

		// To keep track of if something was logged, so wen can output debug info only
		// only if we did not log anything
		$did_log = false;

		if ( isset( $arr_data["type"] ) && "plugin" == $arr_data["type"] ) {

			// Single plugin install
			if ( isset( $arr_data["action"] ) && "install" == $arr_data["action"] && ! $plugin_upgrader_instance->bulk ) {

				$upgrader_skin_options = isset( $plugin_upgrader_instance->skin->options ) && is_array( $plugin_upgrader_instance->skin->options ) ? $plugin_upgrader_instance->skin->options : array();
				$upgrader_skin_result = isset( $plugin_upgrader_instance->skin->result ) && is_array( $plugin_upgrader_instance->skin->result ) ? $plugin_upgrader_instance->skin->result : array();
				$upgrader_skin_api = isset( $plugin_upgrader_instance->skin->api ) ? $plugin_upgrader_instance->skin->api : (object) array();

				$plugin_slug = isset( $upgrader_skin_result["destination_name"] ) ? $upgrader_skin_result["destination_name"] : "";

				// Upgrader contains current info
				$context = array(
					"plugin_slug" => $plugin_slug,
					"plugin_name" => isset( $upgrader_skin_api->name ) ? $upgrader_skin_api->name : "",
					"plugin_version" => isset( $upgrader_skin_api->version ) ? $upgrader_skin_api->version : "",
					"plugin_author" => isset( $upgrader_skin_api->author ) ? $upgrader_skin_api->author : "",
					"plugin_last_updated" => isset( $upgrader_skin_api->last_updated ) ? $upgrader_skin_api->last_updated : "",
					"plugin_requires" => isset( $upgrader_skin_api->requires ) ? $upgrader_skin_api->requires : "",
					"plugin_tested" => isset( $upgrader_skin_api->tested ) ? $upgrader_skin_api->tested : "",
					"plugin_rating" => isset( $upgrader_skin_api->rating ) ? $upgrader_skin_api->rating : "",
					"plugin_num_ratings" => isset( $upgrader_skin_api->num_ratings ) ? $upgrader_skin_api->num_ratings : "",
					"plugin_downloaded" => isset( $upgrader_skin_api->downloaded ) ? $upgrader_skin_api->downloaded : "",
					"plugin_added" => isset( $upgrader_skin_api->added ) ? $upgrader_skin_api->added : "",
					"plugin_source_files" => $this->simpleHistory->json_encode( $plugin_upgrader_instance->result["source_files"] ),

					// To debug comment out these:
					// "debug_skin_options" => $this->simpleHistory->json_encode( $upgrader_skin_options ),
					// "debug_skin_result" => $this->simpleHistory->json_encode( $upgrader_skin_result ),

				);

				/*
				Detect install plugin from wordpress.org
					- options[type] = "web"
					- options[api] contains all we need

				Detect install from upload ZIP
					- options[type] = "upload"

				Also: plugins hosted at GitHub have a de-facto standard field of "GitHub Plugin URI"
				*/
				$install_source = "unknown";
				if ( isset( $upgrader_skin_options["type"] ) ) {
					$install_source = (string) $upgrader_skin_options["type"];
				}

				$context["plugin_install_source"] = $install_source;

				// If uploaded plugin store name of ZIP
				if ( "upload" == $install_source ) {

					/*_debug_files
					{
					    "pluginzip": {
					        "name": "WPThumb-master.zip",
					        "type": "application\/zip",
					        "tmp_name": "\/Applications\/MAMP\/tmp\/php\/phpnThImc",
					        "error": 0,
					        "size": 2394625
					    }
					}
					*/

					if ( isset( $_FILES["pluginzip"]["name"] ) ) {
						$plugin_upload_name = $_FILES["pluginzip"]["name"];
						$context["plugin_upload_name"] = $plugin_upload_name;
					}

				}

				if ( is_a( $plugin_upgrader_instance->skin->result, "WP_Error" ) ) {

					// Add errors
					// Errors is in original wp admin language
					$context["error_messages"] = $this->simpleHistory->json_encode( $plugin_upgrader_instance->skin->result->errors );
					$context["error_data"] = $this->simpleHistory->json_encode( $plugin_upgrader_instance->skin->result->error_data );

					$this->infoMessage(
						'plugin_installed_failed',
						$context
					);

					$did_log = true;

				} else {

					// Plugin was successfully installed
					// Try to grab more info from the readme
					// Would be nice to grab a screenshot, but that is difficult since they often are stored remotely
					$plugin_destination = isset( $plugin_upgrader_instance->result["destination"] ) ? $plugin_upgrader_instance->result["destination"] : null;

					if ( $plugin_destination ) {

						$plugin_info = $plugin_upgrader_instance->plugin_info();

						$plugin_data = array();
						if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_info ) ) {
							$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_info, true, false );
						}

						$context["plugin_name"] = isset( $plugin_data["Name"] ) ? $plugin_data["Name"] : "";
						$context["plugin_description"] = isset( $plugin_data["Description"] ) ? $plugin_data["Description"] : "";
						$context["plugin_url"] = isset( $plugin_data["PluginURI"] ) ? $plugin_data["PluginURI"] : "";
						$context["plugin_version"] = isset( $plugin_data["Version"] ) ? $plugin_data["Version"] : "";
						$context["plugin_author"] = isset( $plugin_data["AuthorName"] ) ? $plugin_data["AuthorName"] : "";

						// Comment out these to debug plugin installs
						#$context["debug_plugin_data"] = $this->simpleHistory->json_encode( $plugin_data );
						#$context["debug_plugin_info"] = $this->simpleHistory->json_encode( $plugin_info );

						if ( ! empty( $plugin_data["GitHub Plugin URI"] ) ) {
							$context["plugin_github_url"] = $plugin_data["GitHub Plugin URI"];
						}

					}

					$this->infoMessage(
						'plugin_installed',
						$context
					);

					$did_log = true;

				} // if error or not

			} // install single

			// Single plugin update
			if ( isset( $arr_data["action"] ) && "update" == $arr_data["action"] && ! $plugin_upgrader_instance->bulk ) {

				// No plugin info in instance, so get it ourself
				$plugin_data = array();
				if ( file_exists( WP_PLUGIN_DIR . '/' . $arr_data["plugin"] ) ) {
					$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $arr_data["plugin"], true, false );
				}

				// autoptimize/autoptimize.php
				$plugin_slug = dirname( $arr_data["plugin"] );

				$context = array(
					"plugin_slug" => $plugin_slug,
					"request" => $this->simpleHistory->json_encode( $_REQUEST ),
					"plugin_name" => $plugin_data["Name"],
					"plugin_title" => $plugin_data["Title"],
					"plugin_description" => $plugin_data["Description"],
					"plugin_author" => $plugin_data["Author"],
					"plugin_version" => $plugin_data["Version"],
					"plugin_url" => $plugin_data["PluginURI"],
					"plugin_source_files" => $this->simpleHistory->json_encode( $plugin_upgrader_instance->result["source_files"] )
				);

				// update status for plugins are in response
				// plugin folder + index file = key
				// use transient to get url and package
				$update_plugins = get_site_transient( 'update_plugins' );
				if ( $update_plugins && isset( $update_plugins->response[ $arr_data["plugin"] ] ) ) {

					/*
					$update_plugins[plugin_path/slug]:
					{
						"id": "8986",
						"slug": "autoptimize",
						"plugin": "autoptimize/autoptimize.php",
						"new_version": "1.9.1",
						"url": "https://wordpress.org/plugins/autoptimize/",
						"package": "https://downloads.wordpress.org/plugin/autoptimize.1.9.1.zip"
					}
					*/
					// for debug purposes the update_plugins key can be added
					// $context["update_plugins"] = $this->simpleHistory->json_encode( $update_plugins );

					$plugin_update_info = $update_plugins->response[ $arr_data["plugin"] ];

					// autoptimize/autoptimize.php
					if ( isset( $plugin_update_info->plugin ) ) {
						$context["plugin_update_info_plugin"] = $plugin_update_info->plugin;
					}

					// https://downloads.wordpress.org/plugin/autoptimize.1.9.1.zip
					if ( isset( $plugin_update_info->package ) ) {
						$context["plugin_update_info_package"] = $plugin_update_info->package;
					}

				}

				// To get old version we use our option
				$plugins_before_update = json_decode( get_option( $this->slug . "_plugin_info_before_update", false ), true );
				if ( is_array( $plugins_before_update ) && isset( $plugins_before_update[ $arr_data["plugin"] ] ) ) {

					$context["plugin_prev_version"] = $plugins_before_update[ $arr_data["plugin"] ]["Version"];

				}

				if ( is_a( $plugin_upgrader_instance->skin->result, "WP_Error" ) ) {

					// Add errors
					// Errors is in original wp admin language
					$context["error_messages"] = json_encode( $plugin_upgrader_instance->skin->result->errors );
					$context["error_data"] = json_encode( $plugin_upgrader_instance->skin->result->error_data );

					$this->infoMessage(
						'plugin_update_failed',
						$context
					);

					$did_log = true;

				} else {

					$this->infoMessage(
						'plugin_updated',
						$context
					);

					#echo "on_upgrader_process_complete";
					#sf_d( $plugin_upgrader_instance, '$plugin_upgrader_instance' );
					#sf_d( $arr_data, '$arr_data' );

					$did_log = true;

				}

			} // update single

			/**
			 * For bulk updates $arr_data looks like:
			 * Array
			 * (
			 *     [action] => update
			 *     [type] => plugin
			 *     [bulk] => 1
			 *     [plugins] => Array
			 *         (
			 *             [0] => plugin-folder-1/plugin-index.php
			 *             [1] => my-plugin-folder/my-plugin.php
			 *         )
			 * )
			 */
			if ( isset( $arr_data["bulk"] ) && $arr_data["bulk"] && isset( $arr_data["action"] ) && "update" == $arr_data["action"] ) {

				$plugins_updated = isset( $arr_data["plugins"] ) ? (array) $arr_data["plugins"] : array();

				foreach ($plugins_updated as $plugin_name) {

					$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_name, true, false );

					$plugin_slug = dirname( $plugin_name );

					$context = array(
						"plugin_slug" => $plugin_slug,
						"plugin_name" => $plugin_data["Name"],
						"plugin_title" => $plugin_data["Title"],
						"plugin_description" => $plugin_data["Description"],
						"plugin_author" => $plugin_data["Author"],
						"plugin_version" => $plugin_data["Version"],
						"plugin_url" => $plugin_data["PluginURI"]
					);

					// get url and package
					$update_plugins = get_site_transient( 'update_plugins' );
					if ( $update_plugins && isset( $update_plugins->response[ $plugin_name ] ) ) {

						/*
						$update_plugins[plugin_path/slug]:
						{
							"id": "8986",
							"slug": "autoptimize",
							"plugin": "autoptimize/autoptimize.php",
							"new_version": "1.9.1",
							"url": "https://wordpress.org/plugins/autoptimize/",
							"package": "https://downloads.wordpress.org/plugin/autoptimize.1.9.1.zip"
						}
						*/

						$plugin_update_info = $update_plugins->response[ $plugin_name ];

						// autoptimize/autoptimize.php
						if ( isset( $plugin_update_info->plugin ) ) {
							$context["plugin_update_info_plugin"] = $plugin_update_info->plugin;
						}

						// https://downloads.wordpress.org/plugin/autoptimize.1.9.1.zip
						if ( isset( $plugin_update_info->package ) ) {
							$context["plugin_update_info_package"] = $plugin_update_info->package;
						}

					}

					// To get old version we use our option
					// @TODO: this does not always work, why?
					$plugins_before_update = json_decode( get_option( $this->slug . "_plugin_info_before_update", false ), true );
					if ( is_array( $plugins_before_update ) && isset( $plugins_before_update[ $plugin_name ] ) ) {

						$context["plugin_prev_version"] = $plugins_before_update[ $plugin_name ]["Version"];

					}

					$this->infoMessage(
						'plugin_bulk_updated',
						$context
					);

				}

			} // bulk update

		} // if plugin

		if ( ! $did_log ) {
			#echo "on_upgrader_process_complete";
			#sf_d( $plugin_upgrader_instance, '$plugin_upgrader_instance' );
			#sf_d( $arr_data, '$arr_data' );
			#exit;
		}

		$this->remove_saved_versions();

	} // on upgrader_process_complete

	/**
	 * Plugin is activated
	 * plugin_name is like admin-menu-tree-page-view/index.php
	 */
	function on_activated_plugin($plugin_name, $network_wide) {

		/*
		Plugin data returned array contains the following:
		'Name' - Name of the plugin, must be unique.
		'Title' - Title of the plugin and the link to the plugin's web site.
		'Description' - Description of what the plugin does and/or notes from the author.
		'Author' - The author's name
		'AuthorURI' - The authors web site address.
		'Version' - The plugin version number.
		'PluginURI' - Plugin web site address.
		'TextDomain' - Plugin's text domain for localization.
		'DomainPath' - Plugin's relative directory path to .mo files.
		'Network' - Boolean. Whether the plugin can only be activated network wide.
		*/
		$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_name, true, false );

		$plugin_slug = dirname( $plugin_name );

		$context = array(
			"plugin_name" => $plugin_data["Name"],
			"plugin_slug" => $plugin_slug,
			"plugin_title" => $plugin_data["Title"],
			"plugin_description" => $plugin_data["Description"],
			"plugin_author" => $plugin_data["Author"],
			"plugin_version" => $plugin_data["Version"],
			"plugin_url" => $plugin_data["PluginURI"],
		);

		if ( ! empty( $plugin_data["GitHub Plugin URI"] ) ) {
			$context["plugin_github_url"] = $plugin_data["GitHub Plugin URI"];
		}

		$this->infoMessage( 'plugin_activated', $context );

	} // on_activated_plugin

	/**
	 * Plugin is deactivated
	 * plugin_name is like admin-menu-tree-page-view/index.php
	 */
	function on_deactivated_plugin($plugin_name) {

		$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_name, true, false );
		$plugin_slug = dirname( $plugin_name );

		$context = array(
			"plugin_name" => $plugin_data["Name"],
			"plugin_slug" => $plugin_slug,
			"plugin_title" => $plugin_data["Title"],
			"plugin_description" => $plugin_data["Description"],
			"plugin_author" => $plugin_data["Author"],
			"plugin_version" => $plugin_data["Version"],
			"plugin_url" => $plugin_data["PluginURI"],
		);

		if ( ! empty( $plugin_data["GitHub Plugin URI"] ) ) {
			$context["plugin_github_url"] = $plugin_data["GitHub Plugin URI"];
		}

		$this->infoMessage( 'plugin_deactivated', $context );

	} // on_deactivated_plugin

	/**
	 * Get output for detailed log section
	 */
	function getLogRowDetailsOutput($row) {

		$context = $row->context;
		$message_key = $context["_message_key"];
		$output = "";

		// When a plugin is installed we show a bit more information
		// We do it only on install because we don't want to clutter to log,
		// and when something is installed the description is most useul for other
		// admins on the site
		if ( "plugin_installed" === $message_key ) {

			if ( isset( $context["plugin_description"] ) ) {

				// Description includes a link to author, remove that, i.e. all text after and including
				$plugin_description = $context["plugin_description"];
				$cite_pos = strpos( $plugin_description, "" );
				if ($cite_pos) {
					$plugin_description = substr( $plugin_description, 0, $cite_pos );
				}

				// Keys to show
				$arr_plugin_keys = array(
					"plugin_description" => _x("Description", "plugin logger - detailed output", "simple-history"),
					"plugin_install_source" => _x("Source", "plugin logger - detailed output install source", "simple-history"),
					"plugin_install_source_file" => _x("Source file name", "plugin logger - detailed output install source", "simple-history"),
					"plugin_version" => _x("Version", "plugin logger - detailed output version", "simple-history"),
					"plugin_author" => _x("Author", "plugin logger - detailed output author", "simple-history"),
					"plugin_url" => _x("URL", "plugin logger - detailed output url", "simple-history"),
					#"plugin_downloaded" => _x("Downloads", "plugin logger - detailed output downloaded", "simple-history"),
					#"plugin_requires" => _x("Requires", "plugin logger - detailed output author", "simple-history"),
					#"plugin_tested" => _x("Compatible up to", "plugin logger - detailed output compatible", "simple-history"),
					// also available: plugin_rating, plugin_num_ratings
				);

				$arr_plugin_keys = apply_filters("simple_history/plugin_logger/row_details_plugin_info_keys", $arr_plugin_keys);

				// Start output of plugin meta data table
				$output .= "
";

				foreach ( $arr_plugin_keys as $key => $desc ) {

					$desc_output = "";

					switch ( $key ) {

						case "plugin_downloaded":
							$desc_output = esc_html( number_format_i18n( (int) $context[ $key ] ) );
							break;

						// author is already formatted
						case "plugin_author":
							$desc_output = $context[ $key ];
							break;

						// URL needs a link
						case "plugin_url":
							$desc_output = sprintf('%2$s', esc_attr( $context["plugin_url"] ), esc_html( $context["plugin_url"] ));
							break;

						case "plugin_description":
							$desc_output = $plugin_description;
							break;

						case "plugin_install_source":

							if ( ! isset( $context[ $key ] ) ) {
								continue;
							}

							if ( "web" == $context[ $key ] ) {
								$desc_output = esc_html( __("WordPress Plugin Repository", "simple-history") );
							} else if ( "upload" == $context[ $key ] ) {
								#$plugin_upload_name = isset( $context["plugin_upload_name"] ) ? $context["plugin_upload_name"] : __("Unknown archive name", "simple-history");
								$desc_output = esc_html( __('Uploaded ZIP archive', "simple-history") );
								#$desc_output = esc_html( sprintf( __('Uploaded ZIP archive (%1$s)', "simple-history"), $plugin_upload_name ) );
								#$desc_output = esc_html( sprintf( __('%1$s (uploaded ZIP archive)', "simple-history"), $plugin_upload_name ) );
							} else {
								$desc_output = esc_html( $context[ $key ] );
							}

							break;

						case "plugin_install_source_file":

							if ( ! isset( $context["plugin_upload_name"] ) || ! isset( $context["plugin_install_source"] ) ) {
								continue;
							}

							if ( "upload" == $context["plugin_install_source"] ) {
								$plugin_upload_name = $context["plugin_upload_name"];
								$desc_output = esc_html( $plugin_upload_name );
							}

							break;

						default;
							$desc_output = esc_html( $context[ $key ] );
							break;
					}

					if ( ! trim( $desc_output ) ) {
						continue;
					}

					$output .= sprintf(
						'

							%1$s
							%2$s

						',
						esc_html($desc),
						$desc_output
					);

				}

				// Add link with more info about the plugin
				// If plugin_install_source	= web then it should be a wordpress.org-plugin
				// If plugin_github_url is set then it's a zip from a github thingie
				// so use link to that.

				$plugin_slug = ! empty( $context["plugin_slug"] ) ? $context["plugin_slug"] : "";

				// Slug + web as install source = show link to wordpress.org
				if ( $plugin_slug && isset( $context["plugin_install_source"] ) && $context["plugin_install_source"] == "web" ) {

					$output .= sprintf(
						'

							%2$s

						',
						admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin_slug}&section=&TB_iframe=true&width=640&height=550" ),
						esc_html_x("View plugin info", "plugin logger: plugin info thickbox title view all info", "simple-history")
					);

				}
				// GitHub plugin url set = show link to github repo
				else if ( isset( $context["plugin_install_source"] ) && $context["plugin_install_source"] == "upload" && ! empty( $context["plugin_github_url"] ) ) {

					// Can't embed iframe
					// Must use API instead
					// https://api.github.com/repos/<username>/<repo>/readme?callback=<callbackname>

					$output .= sprintf(
						'

							%2$s

						',
						admin_url(sprintf('admin-ajax.php?action=SimplePluginLogger_GetGitHubPluginInfo&getrepo&repo=%1$s&TB_iframe=true&width=640&height=550', esc_url_raw( $context["plugin_github_url"] ) ) ),
						esc_html_x("View plugin info", "plugin logger: plugin info thickbox title view all info", "simple-history")
					);

				}

				$output .= "
";

			}

		} elseif ( "plugin_bulk_updated" === $message_key || "plugin_updated" === $message_key || "plugin_activated" === $message_key || "plugin_deactivated" === $message_key ) {

			$plugin_slug = ! empty( $context["plugin_slug"] ) ? $context["plugin_slug"] : "";

			if ( $plugin_slug && empty( $context["plugin_github_url"] ) ) {

				$link_title = esc_html_x("View plugin info", "plugin logger: plugin info thickbox title", "simple-history");
				$url = admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin_slug}&section=&TB_iframe=true&width=640&height=550" );

				if ( "plugin_updated" == $message_key || "plugin_bulk_updated" == $message_key ) {

					$link_title = esc_html_x("View changelog", "plugin logger: plugin info thickbox title", "simple-history");

					if ( is_multisite() ) {
						$url = network_admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin_slug}&section=changelog&TB_iframe=true&width=772&height=550" );
					} else {
						$url = admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin_slug}&section=changelog&TB_iframe=true&width=772&height=550" );
					}

				}

				$output .= sprintf(
					'
%2$s
',
					$url,
					$link_title
				);

			} else if ( ! empty( $context["plugin_github_url"] ) ) {

				$output .= sprintf(
					'

						%2$s

					',
					admin_url(sprintf('admin-ajax.php?action=SimplePluginLogger_GetGitHubPluginInfo&getrepo&repo=%1$s&TB_iframe=true&width=640&height=550', esc_url_raw( $context["plugin_github_url"] ) ) ),
					esc_html_x("View plugin info", "plugin logger: plugin info thickbox title view all info", "simple-history")
				);

			}

		} // if plugin_updated

		return $output;

	} // getLogRowDetailsOutput

} // class SimplePluginLogger

redpajama_set_name: RedPajamaGithub


Seraphic as it name stands works with incredible minds in its team that the results are angelic to the core. We have in the past delivered gaming apps as per the vision of our clients that have taken the gaming world by storm. We are versatile with both iOS and Android systems. Your vision is all it takes to build your dream project into reality. We render full commitment and services to our clients no matter how big or small your project is. We take each project as our utmost priority and pays full sincerity towards it.
Seraphic has a team of skilled, intellectual and creative minds that are regularly innovating and inventing applets and software so unique and persistent that we proudly claim that there is no task, no idea, and no error that we cannot resolve, build or eradicate in a given frame of time.
Our services are quick, stress free and most importantly worth the value. We work with full confidentially terms of our clients and make sure that their interests, their vision flourish in full light where we make amends and give suggestions keeping in view client's needs at all times so we serve them with the best possible way and give exuberant results for full client satisfaction.
When you sign up with Seraphic services, you become one of our members. For us you will always stand as our priority and until you get what you want we don't give up and make sure all your worries and needs are taken care of while building the app for you which will enliven your vision and show our creativity.
Your idea, our expertise is all set to rock the world! So let's start and roll the dice!
We believe in rising together. Your success is our success and we make sure that we put all our efforts and make your dream project as our dream project and take it to great heights.
We work away from the commotion and the hullabaloo of the Digital World; instead we work on creating something out of the ordinary. Seraphic is a team of inventors where everything gels abnormally well. We stay pumped up and excited at all times where new ideas flourish and old are reinvented. Only the best is served on the plate!
Coordination, teamwork and communication are our principles that we work on. We are a bird's nest where every little thing grows and prospers touching the sky each time. For us, the sky is our limit and we constantly thrive to even push ourselves further and go beyond to catch up with what may seem impossible to make it possible!
Archimedes stated the physical law of buoyancy; we apply it in our everyday work environment. The only difference there is no liquid or gasses involved but a healthy atmosphere, fun-packed activities and an ambience where everyone uplifts each other together. It is a proven fact that a relaxed mind works faster than the one under pressure. Ideas cannot be weaved in a stressful environment! We work with zeal, enthusiasm and bear an adventurous heart with the hunger to dug deep in the darkness and throw some light.
Discipline, schedule and planning is a must! Our customers are our foremost priority where we believe in creating long lasting relationships. Business Ethics is not only a term for us but it is in our genes. Punctuality, avid results, expertise, intellects, timely updates and much more are how we work. Your expectations are our driving force. We give our heart and soul to the projects we take.
No hidden agendas, no loose talks and no scepticism! We are open to our client's needs, however, and whatever they want it. We stay crystal clear on our commitments and once there is a project taken, it becomes our sole priority. Your vision together with our prowess, can woe the world in exponential ways.
Are you still waiting? Why waste time, let's start with the crusade and get on a journey leading to victory and triumph!


text:
layout: post
title:  "My first job"
date:   2015-04-12 21:38
description: My first job, frontend developer at Archon Dronistics
categories:
- personal
permalink: my-first-job
---

Those of you that are in my Linkedin's network maybe already known: since the
beginning of April I've a job. It's not in Canonical, unfortunately, or in any
other opensource project.

**But it's an amazing job.**

I started to work at [Archon Dronistics][archon]. It's a startup, seeking
investors, specialized in providing automated operations with drones.

**Fucking flying drones**. Something like this:

![Blank][img0]

And these drones are driven by (our) IA. How much awesome is it?

## My job

So, I work at Archon as Frontend Developer: I take care of creating the control
panel for the management of fleets of drones, to assign them missions and
patrols.

Frontend is all in [AngularJs][angular], and we use a lot [Leaflet][leaflet], an
opensource Javascript library to manage maps. I hope I'll be able to use
contribute a bit upstream.

It's a couple of week I work with them, and I'm quite happy: I like AngularJs
and I love idea of drones. Have I already said how cool drones are?

## Ubuntu

I work part time, because I've also university to do. Of course, part of this
time is taken from the time I spent on Ubuntu. But don't worry, I will not stop
to contribute: you'll can read what I do in my monthly reports.

I gained a lot of free time stopping play Dota (I spent more than 660 hours on
it in 1 year), and I'll sleep a bit less. Because Ubuntu is too much important
for me :-)

Also, it's thanks to Ubuntu I've a job: I'm a student, so I don't have any
experience. But they see my contributions to ubuntu, and it's a great curriculum
vitae.

This is one more reason I should add to the article [*Why you should contribute
to Ubuntu Touch (or any other opensource project)*][contribute].

So, if you have any free time, do something for an opensource project: I'm sure
it will give you a lot of good things. At least, this is what's happening to me
;-)

Ciao, <br/>
R.

[archon]: http://www.archondronistics.com/
[img0]: https://img.rpadovani.com/posts/drones.jpg
[angular]: https://angularjs.org/
[leaflet]: http://leafletjs.com/
[contribute]: http://rpadovani.com/why-you-should-contribute-to-ubuntu-touch/


text:
ARCHIVED Blog Pages
What is Science
The Evidence (AGW is disproved)
Evidence (definition)
The evidence that AGW fans need to provide
All posts connected to AGW disproved
All posts tagged "evidence"
Logic and Reason
ClimateGate: 30 year timeline
ClimateGate: Thirty Years in the Making (Edition 1.1)
Hockey Stick Graph
The hot spot graphs
The Models are wrong
All hot spot related pages
Sea Levels
Sea-levels – last 200 years
Australian Sea-levels
Oceans – missing heat
Climate History
Little Ice Age
Medieval Warm Period
Roman Warm Period
Holocene Period
Vostok Ice Core Graphs
The 800 year lag in CO2 after temperature – graphed
Last 65 million years (graphs)
Surface Stations (problems with)
Australian Temperature data
Surface Records
Homogenisation
Micro-siting problems
Thermometer selection (mystery loss of data)
Urban Heat Island Effect (UHI)
Climate Money
Australian Research Council Grants
Big-Green
Big-Bankers
Big-Government
Australian Elected Representatives – Emails and phones
Western Australian State Government email list
The Thompsons
Donations for the Thompson children
Posts tagged "Thompsons"
Odour reduction practices at Narrogin Beef Producers
Photos of The Thompsons
Peter Spencer
The Wong Fielding Meeting on Global Warming — Documents
Key Links in the Global Warming Debate
Direct Debit or Cheque
Skeptics Handbook
Skeptics Handbook Art
Serious Science Party Tricks
Books delivered in Australia
Books Delivered Overseas
Other information on Jo
Hands-on science
Bubble-mix-science
Bubbles and Clouds in Ice
Diver in a bottle
Suck a water balloon into a bottle
The air-powered water rocket
Corporate Cornflour
Get Laughs, Get Attention, Get Your Message Across
My 300th Birthday
Expert Predictions
Feedback from schools
'Y?' – The childrens TV science show
A perfectly good civilization is going to waste…
A science presenter, writer, speaker & former TV host; author of The Skeptic's Handbook (over 200,000 copies distributed & available in 15 languages).
Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
Former Greens leader Bob Brown campaigns against wind farm
Weekend Unthreaded
Vegans save a cow, kill 1,000 mice. Eat less red meat, get anemia.
Climate scare machine — happy to use people with a mental illness as a promotional tool:
Midweek Unthreaded
Antarctica was warmer one thousand years ago — and life was OK
Falling sea levels bleaches corals — hear from Jen Marohasy in Maroochydore, Sunday
Fed up UK viewers raise £33,567 in days for legal challenge about BBC Bias
Methane emissions: don't blame cows and camels, blame the oceans
The nerds have the numbers on precious metals investments on the ASX
Think it has been debunked? See here.
Australian Politics (155)
Satire & Parody (126)
Renewable Energy (100)
Climate Money (78)
Australian temperatures (77)
JoNova's Favourites (68)
Evans (David) (68)
Wind Power (56)
Media bias (55)
Monckton (Christopher) (52)
Electricity Cost (47)
Climate Models (46)
Electricity Grids (45)
Lewandowsky (Stephan) (40)
SA (South Australia) (40)
Big-Government (39)
Sea Level (39)
Global Temperatures (33)
Consensus (31)
Missing Hot Spot (30)
Adjustments to data (28)
Cooling & cold snaps (28)
United Nations (UN) (27)
Climate Research 2015 (27)
- Guide for Commenting
AGW socio-political
Geostrategic
Logic & Reason
Media-matters
Monetary History
Science of Money
Student Resouce
The Skeptics Handbook
Zombie Hockey stick dies again »
« South Pacific sea levels – Best records show little or no rise?!
Carbon-trading supertanker adrift
Good news… In news just in, there's another important sign that the momentum is shifting as Money goes in search of better prospects.
ICE cuts 50% of staff at Chicago Climate Exchange
The 1st round of layoffs began July 23, with more to come. U.S. climate inaction is being blamed as main reason for cuts. Things are so bad, that ICE is collecting feedback on what to do with climate bourse
ICE just came in one day and started hacking away … We were told the company was restructuring," said one source, who declined to be named.
Another said ICE cut around 20 roles at the CCX late last month, and at least another six high-level layoffs would come before next spring.
ICE bought Climate Exchange plc, owners of the CCX as well as London's European Climate Exchange (ECX), the world's largest marketplace for carbon credits, in April for 395 million pounds ($622 million), despite failed UN climate talks in Copenhagen last December and a lack of U.S. action on climate change.
Last week, ICE chairman and CEO Jeff Sprecher said the CCX may be pared due to a lack of profitability and that ICE is now seeking feedback about what to do with the exchange.
But prices for the carbon credits traded on the bourse since its 2003 launch, which were based on voluntary but legally binding emissions reduction commitments by its members, have crashed to around 10 cents a tonne from all-time highs of over $7 in 2008, and trading volumes have largely dried up.
Voluntary CO2 offset market participants shrink
LONDON, Aug 12 (Reuters) – Some major participants in the voluntary carbon market are shrinking after the United States failed to implement federal cap-and-trade legislation and the market stopped growing last year.
Intercontinental Exchange Inc. (ICE.N) has laid off staff at newly acquired Chicago Climate Exchange (CCX), industry sources said this week; the head of MF Global's voluntary markets desk departed in June ; and EcoSecurities ECO.L closed its U.S. office earlier this year.
The market slowed in 2009 after six consecutive years of growth due to the economic downturn and uncertainty about future climate legislation. It fell by 47 percent in value to $387 million in 2009, said a report by EcoSystem Marketplace and Bloomberg New Energy Finance.
For the full story on Reuters, click the headings.
Carbon-trading supertanker adrift, 5.5 out of 10 based on 2 ratings
The short killer summary: The Skeptics Handbook. The most deadly point: The Missing Hot Spot.
: : : : : : : : : : : : :
Tiny Url for this post: http://tinyurl.com/26x3enm
August 17th, 2010 | Tags: Carbon Market, Climate Money | Category: Global Warming | Print This Post | Email This Post |
48 comments to Carbon-trading supertanker adrift
And in another surprising development the British coalition government is putting tough new emissions targets on hold:
http://www.guardian.co.uk/environment/2010/aug/15/coal-fired-power-stations-coalition
Henry chance
The Friday price was 10 cents for a metric ton of CO2. The number of tons traded was zero. What do you need people for if sales are at zero?
Fred from Canuckistan
Usually when a market collapses, it is an economic disaster.
In this case, it is a cause for celebration.
Woooooooooooooooooooooo Hooooooooooooooooooooooooooooo.
pattoh
You have to wonder where this may leave all our electricity supply companies who have been enthusiastically working away at their new price structures.
Even before the erstwhile Australian Government had announced a policy to only commit to new power generation with CCS & other green restrictions, the reticulation & supply companies have been talking up ~60% electricity price increases.
Presumably these increased charges were to pay for the modifications to the generation & supply system & engage in whatever carbon trading was necessary to continue to operate under some sort of a CPRS.
Ah well, I am sure all those electricity supply people will get greater job satisfaction with new cars & satellite phones
The power companies were licking their lips at the thought of any sort of carbon trading/taxing. For the same reason cigarette companies like the tobacco tax, when 75% of the retail price is in government tax know one notices you creeping your margins up by 10% or more.
Ken Stewart
Don't worry guys, after Saturday the Greens are likely to have the balance of power in Oz.. Check out their policies to see where we are heading. I don't normally show much political interest but this is truly scary. Carbon trading will be about the only trade left.
I am sure it will not be long before the trade in blame, finger pointing, retrospective denial & innocence becomes the vogue. I wonder if they will work out a way to tax that!
The Greens support the following DANGEROUS policies…….
The Greens support "One World Government". So much for Australia's Sovereignty!
http://greens.org.au/node/776
The Greens advocate the destruction of the Australian Coal Industry. Hope you don't enjoy using electricity, and like being COLD and eating raw food!
http://greens.org.au/policies/climate-change-and-energy/climate-change-and-energy
Australians must remember that a vote for The Greens IS a vote for Gillard/Labor and a vote for an ETS/carbon trading!
Oh and also The Greens support DEATH DUTIES!
Not satisified to screw you over when you are alive with a carbon tax based on the FRAUD of man made global warming, tey also want to screw you over WHEN YOU ARE DEAD ALSO!
http://www.vecci.org.au/news/Pages/Greens_want_to_tax_death.aspx
You do all realize that the NASA Satellite Temperature Data being used to support the man made global warming science fiction has just been shown to be erroneous….
http://www.climatechangefraud.com/climate-reports/7491-official-satellite-failure-means-decade-of-global-warming-data-doubtful
Why not listen to an interview with a politician from New Zealand where a TREASONOUS Emmissions Trading Scheme has been forced on the population to see what an enormous detrimental effect it has had on their society.
Alan Jones talks to Rodney Hyde – New Zealand MP on the impact of an ETS…..
http://www.2gb.com/podcasts/alanjones/alanjoneshyde120810.mp3
The Greens == The Watermelons – green on the outside, RED ON THE INSIDE!
COMMUNISTS.
Job losses woohoo!
Lawrie
As all here know the problem with carbon trading is that the expence is totally unjustified. My favourite climate rag "Climate Spectator" wonders why there is so much doubt about climate science. I apologise for the length of the post but the registration process can be off-putting.
Getting back to science
Published 6:16 AM, 17 Aug 2010
Giles Parkinson
Australian climate change scientists do not need much reminding, but if they were looking for evidence yesterday on how difficult the climate change debate has become, they did not have to look far.
Three years ago, the federal election campaign was heavily influenced by the issue of climate change and what political parties would do about it. They all agreed they should do something and committed to a carbon price.
Yesterday, in the ALP's official campaign launch, in a half hour speech, the current Prime Minister Julia Gillard did not breathe a word about it.
Meanwhile, across the Tasman in New Zealand, which now has a carbon price, a group of climate sceptics, the Climate Science Coalition, asked the High Court to "set aside" the data used by the National Institute of Water and Atmospheric Research to calculate climate change.
Scientists in New Zealand dismissed the action as a "nonsense designed to attract publicity and spread fear, uncertainty and doubt". But that is exactly the problem the scientific community is facing: such actions are succeeding in doing what they are designed to do, to spread doubt.
Scientists are frustrated. Professor Andy Pitman of the UNSW told a climate change and business conference in Sydney last week that to say that the earth is warming is as scientifically complex as saying that if jump off edge of cliff, you will be subject to gravity.
Clearly, not everyone accepts that. If they did, we would already have a price on carbon and clear policies to reduce greenhouse gas emissions as quickly as possible. But enough doubt has been sown to make this issue 'politically difficult' – Tony Abbott said yesterday he thought there was a "credible scientific counterpoint" to the work of the UN's Intergovernmental Panel of Climate Change – and scientists are recognising that they may be at least partly to blame.
The Australian Academy of Science has brought together leading climate change scientists and compiled a new document, released yesterday, that it hopes will better inform the broader community about the science that underpins the debate around climate change.
"There is a sense of frustration," says Kurt Lambeck, the immediate past president of the academy. "This was a very important issue that was getting a lot of debate and consensus was being reached. Somewhere along the line, the debate started to fall apart." He said the complexity of the science, and its uncertainties, particularly in predictive models, meant that it was difficult for many in the community to understand. Hence, the new document.
The document, titled "Science of Climate Change: Questions and Answers," is based around four principal lines of evidence – physical principles that say that greenhouse gases trap heat and keep the planet warmer than it would otherwise be; the record of the distant past, which shows that climate can be sensitive to small external influences; measurements from the recent past, which show that the earth is warming and that this is leading to other environmental changes; and climate models, which say that unless greenhouse gas emissions are reduced, and concentrations stablised, warming will continue.
The paper seeks to address seven questions: What is climate change? How has the earth's climate changed in the distant past? And the recent, past? Are human activities causing climate change? And if so, how it will evolve in the future? What will the consequences be? And how do we deal with the uncertainty?
Which makes it a significant document, and one that might not be easily distilled in newspaper headlines or radio and TV grabs, where a simple "no, it's not" seems sufficient to challenge the contention that "yes, it is."
"What is being attempted is probably one of the most complex challenges that the scientific community has ever faced and potentially one of the most important," says Lambeck.
"There will be debate in scientific community on the science, mistakes will be made and they will be corrected. This is part of the process. The challenge for observors and reporters is to draw distinction between the genuine, and smokescreens by those who have little understanding of the science."
Lambeck says the scientists had considered a large document, but were conscious of the need to make it accessible. He describes it as a "trustworthy reference book that is not too arduous too read."
But not quite soon enough – or perhaps even simple enough – to push for inclusion in the re-election campaign of a fearful government. Just in time, perhaps, for the citizens assembly, when the ability of scientists to communicate their message in a series of sound-bites for the popular media, and deal with the naysayers, will test the limits of their patience once again.
Why We Don't Agree
Submitted by Lawrie Ayres on Tue, 2010-08-17 11:38.
The reason for doubt concerning the Global Warming debate is very simple. Only scientists who agree with the hypothesis that CO2 emissions cause Global Warming have access to government grants. Scientists who postulate other reasonable natural systems that explain temperature increases are denied access to journals and to data. When they do make a point they are derided and belittled. Now that alternative scientific solutions are being found the alarmists are in a relative panic. When referring to record temperatures, the record is very short as it is well known that the temps in the Medieval Warm Period were at least 1 degree Celsius hotter than present. The biggest problem the alarmists have is that the computer models on which they rely have not been able to duplicate the recent stasis in temperature whilst CO2 emissions continue to soar.
If those scientists now complaining about doubt were truly honest they would welcome something like a Royal Commission where all climate related science could be given an open hearing. So far they have rejected such forums because they know their science is at best shaky.
Quick points response
Submitted by Giles Parkinson on Tue, 2010-08-17 09:44.
Richard. All those points are addressed in the document. The scientists emphasised yesterday that weather is not climate, but the statistics do show that the number of record hot days is increasing, and the number of record cold days decreasing. This, they say, points clearly to a trend. They have a table to show this.
And they also address past warmings and coolings and the reasons why. I should have provided a link, so here it is … http://www.science.org.au/policy/climatechange2010/index.html
Quick points. Climate change
Submitted by Richard Cornwell on Tue, 2010-08-17 09:35.
Quick points.
Climate change advocates would do well not to seize on any unusual weather event as supporting their claims (ie Russian heatwave, hurricanes etc.) while dismissing any that aren't convenient (a cold winter) etc. it just reeks of hypocrisy and damages credibility. Also, rubbishing every critic as being paid by the oil industry rather than countering their points is also detrimental. There are far more careers and grant money in the climate change industry than there is for their critics. No one is pure.
Also, when it comes to quoting models, does your model explain the medieval warming period and the mini Ice Age in the 17th century and why is the current warming different? Back testing models is incredibly important and given the large climate variations that we know of in the past and we need to be sure that there aren't natural long term processes going on.
just as interesting is talk of privatising the UK Met Office:
13 Aug: Guardian: Plan to sell off nature reserves risks 'austerity countryside'
Among the plans being considered by the government, which once declared itself "the greenest ever", are selling off national nature reserves; privatising parts of the Forestry Commission; privatising the Met Office, one of the world's leading research organisations on climate chang…
http://www.guardian.co.uk/politics/2010/aug/13/plan-sell-nature-reserves-austerity-countryside
btw jo, after 2 full days of serious online debate on the McShane & Wyner paper, there is not a single mention of it in the MSM anywhere in the world. how truly extraordinary…and telling!
Why dont they turn Chicago Climate Change into the Chicago Thermal Coal Exchange? That would serve a real need, as it is currently quite hard to hedge, or speculate in coal
allen mcmahon
I wonder if Gore sold his shares at the peak price of $7 per ton. Well at least the price can go no lower as the minimum share price is 5 cents and admin costs are 5 cents.
what a disgrace. look forward to your response jo:
17 Aug: SMH: Scientists say global warming is undeniable
Deborah Smith SCIENCE EDITOR
THE world will be hotter by 2100 than at any time in the past few million years if greenhouse gas emissions continue unabated, the Australian Academy of Science warns in a new report…
Produced and reviewed by two expert panels, the 24-page report, The Science of Climate Change, Questions and Answers, acknowledges there are still scientific uncertainties about some of the details of climate change…
A former academy president, Kurt Lambeck, said the report was aimed at clarifying often contradictory comments from non-scientific "instant experts"….
http://www.smh.com.au/federal-election/climate/scientists-say-global-warming-is-undeniable-20100816-12701.html
pdf: Report: The Science of Climate Change, Questions and Answers
http://www.science.org.au/reports/climatechange2010.pdf
16 Aug: ABC: Report aims to combat climate 'misinformation'
By environment reporter Sarah Clarke
The statement released by the Australian Academy of Science is a first for the organisation and details the key evidence identified globally by climate scientists…
Kurt Lambeck from the Australian National University says current misinformation is confusing the public debate and the warnings need to be identified…
Professor Lambeck says the complexity of the issue may be one reason both sides of politics seem to have shelved the issue of climate change.
"I suspect both sides find it hard to understand what they should be doing," he said…
The statement makes the point that no scientific conclusion can ever be absolutely certain.
But Professor Lambeck does not think that leaves the conclusions open to sceptics and critics…
http://www.abc.net.au/news/stories/2010/08/16/2984712.htm?section=justin
u can tell it's election time and future funding concerns must be a priority:
17 Aug: SMH: Abbott still doubts planet is getting hotter
Ben Cubby ENVIRONMENT EDITOR
TONY ABBOTT has restated his sceptical views on climate change, and suggested the world may be getting cooler, as the Australian Academy of Science released a new report warning of the future impact of global warming…
The renewed argument over the science of climate change comes as a study of 300 federal, state and local government political leaders, by the University of Queensland, suggests sharp differences in beliefs and understanding around global warming between the Coalition and Labor parties.
Coalition MPs were less likely to believe climate change is happening, and showed less trust in scientists, although the results reflected only those who decided to take part in the survey. Forty-one federal MPs, 101 state MPs and 69 local government representatives took part.
The results showed 38 per cent of Coalition politicians believed the world was getting warmer because of human-induced carbon emissions, compared with 57 per cent of non-aligned politicians, 89 per cent of Labor politicians and 98 per cent of Greens.
"This difference is unlikely to have occurred by chance," said Dr Kelly Fielding, of the university's Institute for Social Science. "What it shows is that a much higher proportion of Liberal-National politicians are uncertain in their views, whereas on average the Labor politicians are more likely to agree with the statements made by scientists."
http://www.smh.com.au/federal-election/climate/abbott-still-doubts-planet-is-getting-hotter-20100816-126zw.html?autostart=1
12 Aug: Uni of Qld: Climate change sparks great political divide
The inaugural Political Leaders and Climate Change Index (PLCCI) – co-sponsored by the Global Change Institute and the Institute for Social Science Research, both at The University of Queensland – demonstrates that beliefs about climate change diverge dramatically along political lines.
Dr Kelly Fielding, of UQ's Institute for Social Science Research, said preliminary results from the survey confirmed that Labor politicians have a greater belief and comprehension of climate change and its impacts…
The Director of UQ's Global Change Institute, Professor Ove Hoegh-Guldberg, said he was surprised by the results.
"They suggest that many politicians are not going to the experts for information on this important matter," Professor Hoegh-Guldberg said.
"The survey confirms suspicions of a great political divide. On one hand, you have political leaders that are listening to the science on climate change and are taking it extremely seriously.
"On the other, you have others who have less regard for the science and appear not to fully understand the serious nature of climate change for Australia and the world.
"It is of great concern that a large number of political leaders do not feel compelled by the overwhelming scientific case for climate change.
"So the question needs to be asked – where do those political leaders who are not highly-influenced by science get their information on climate change?
"Why they would not be influenced by climate change experts who have spent their careers exploring this critically important issue in a non-biased fashion needs answering." …
Interestingly, a sample of the general population surveyed on the same issues as part of the PLCCI, highlighted that political leaders overall were less likely to believe in climate change, and the need to act, than members of the public.
"What is surprising is that the community remains convinced that climate change is a major challenge and yet some political leaders appear to be denying climate change," Professor Hoegh-Guldberg said.
"There is a significant political divide on climate change and it would be good politics to rethink this particular issue." …
http://www.uq.edu.au/news/index.html?article=21715
amusingly, Uni of Qld didn't find sceptics having any influence, saying:
"In addition to scientists, environmental groups, international figures and constituents were considered as influential sources by all respondents, irrespective of their political persuasion."
from Lambeck's Foreword:
"The Academy also thanks the Department of Climate Change and Energy Efficiency for providing financial support to
prepare this document."
after this, i'll leave it to u, jo:
Austn Academy of Science: The membership of the Working Group who prepared these questions and answers was as follows:
• Dr lan Allison (Co-Chair)
• Professor Michael Bird
• Dr John Church
• Professor Matthew England
• Professor lan Enting
• Professor David Karoly
• Dr Mike Raupach (Co-Chair)
• Professor Jean Palutikof
• Professor Steven Sherwood
The draft answers to the questions were reviewed by an Oversight Committee of Academy Fellows and other experts including:
• Professor Graham Farquhar
• Dr Roger Gifford
• Professor Andrew Gleadow
• Dr Trevor McDougall
• Dr Graeme Pearman
• Dr Steve Rintoul
• Professor John Zillman
Mike borgelt
Pat, Nice list of AGW alarmists and fruit loops there.
I don't suppose you've been funded by the Dept. of Climate Change lately? Maybe you should drop them a line and point out you can offer them much better value for money than that lot of oxgen theives Pat listed.
Worth a try…:)
Proffessor HG says that some, the unbelievers, politicions are not going to the experts for their information. Interesting that he does not consider Archibald, Plimer, Carter and co experts. Oh. They have a different answer that doesn't involve big government and big grants.
I would love to be science minister in an Abbott government. Lots of redundancies and re-allocation of funds.
I suspect more Lib/Nats don't "believe" because they learnt to read and question at some time. Labor just follow the leader, no questions just blind obedience. As for the general populace they believe what the media tells them. They are either trusting, lazy or stupid. Most will vote Labor on Saturday.
J.Hansford
LoL Lawrie, ya beat me to it…. I was going to point out that there seems to be a little problem with the classification of Scientists and Experts…. seems you're not a scientist or an expert if you are a Sceptical scientist or expert.
Anne-Kit Littler
Must-read! Christian Kerr's devastating expose of the Green Party agenda in today's Australian:
The Green Party's economic agenda has barely been examined
"..the Greens do not have an official economics spokesman in parliament, and there is no Treasury spokesman."
"Former Labor senator John Black says the Greens simply do not get economics. He believes the party does not understand its primacy, let alone how a complex machine such as the economy operates. Black runs a social research company. He says the Greens' core demographic has two outstanding characteristics. It is well-off and has liberal arts degrees. "It doesn't have degrees where you have to add up," he says.
Black points to an additional characteristic of many Greens supporters. They work in the public sector and have defined-benefit superannuation."
(my emphasis)
Bob Malloy
Pat @15
my bold
11% of Labor politicians it seems are honest enough to doubt the science, but not morally strong enough to vote that way, I truly don't believe there are no others. Until elected Labor members start representing the electors that put them there, no one should vote for them. I come from a family who for generations past always voted Labor, I believe they would no longer recognise this as the same party that they supported.
Leading up to last years vote on the ETS I emailed all senators as well as my local member and Penny WrongWong outlining doubts I held with the science, I included several references to papers offering alternate views.
I must congratulate several Liberal and National party members for their prompt response along with Steve Fielding. Even Bob Brown's office had the courtesy to reply, of all the Labor members canvassed I received only two replies regarding climate change, both from my local member one on his own behalf and one on behalf of Penny Wong. The one on behalf of Penny arrived after the bill was put out to pasture. The other reply received from a Labor minster was from our minister of defense, in general it stated that if I did not want to raise a point that related to his portfolio he was not interested.
Spare a thought for those souls down at the BBC. I'm told that their retirement monies have been ploughed into the carbon market which might explain their behaviour a little, but they have done their dough badly. Lots will get hurt, almost all of them innocent. If Al Gore lives long enough, and his deceit is laid bare, will the law suits roll?
alGore splits his carbon credits with Tipper in divorce. She may let him keep them. They are valued at cost and not market.
Volume of trading yesterday was zero. Turning out the lights would save energy.
This is what is good about free markets unencumbered by government intervention. Carbon credits = no value. Why? because that is all they're worth.
THE COMMUNIST PARTY OF AUSTRALIA BACKS "THE GREENS" IN THE FEDERAL ELECTION!
IF THAT IS NOT A REASON TO NOT VOTE FOR "THE GREENS" THEN I DON'T KNOW WHAT IS!
WHAT'S NEXT A TALIBAN CANDIDATE!
http://www.cpa.org.au/guardian/2010/1467/02-to-cpa-members.html
GILLARD & THE COMMUNIST LABOR PARTY WANT TO ACCESS YOUR EMAILS AND INTERNET WEB BROWSING HISTORY!!!
http://apcmag.com/govt-may-record-users-web-history-email-data.htm
THESE COMMUNISTS HAVE TO GO!!!!!!!!!!
BRING ON THE ELECTION!!
Top Climate Scientists Speak out on the Satellitegate Scandal….
Now its 5 sattelites with corrupted data!
hahaha its all starting to fall apart!!!!
http://canadafreepress.com/index.php/article/26603
Very OT. Quick question. I seem to recall reading somewhere that if we burned all known deposits of oil, gas and coal that would could only double the current CO2 concentration. Does anyone recall this? Is there a citation somewhere for this?
Anne-Kit @22:
" the Greens' core demographic has two outstanding characteristics. It is well-off and has liberal arts degrees. "It doesn't have degrees where you have to add up," he says.
Luckily it doesn't correlate the other way: I used to fit all those characteristics!
JULIA GILLARD, THE LABOR PARTY AND THE FABIAN SOCIETY…….
Most significant is JULIA GILLARD'S present membership in the Australian Fabian Society, which she claimed absorbed the Socialist Forum! You'll note in that link, in the interview she gave to ABC's Tony Jones, she describes the Socialist Forum as "a sort of debating society"! Yeah, and Karl Marx was a free market conservative!!!
And who are the Fabian Society?
This is very informative and interesting on these SUBVERSIVE FABIANS:-
http://www.australiamatters.com/fabian.html
This is a picture of their famous stained glass window:-
http://www.marxists.org/subject/economy/authors/fabians/images/FabianWindow_Large.jpg
Look closely and you will see:-
1 The wolf in sheep's clothing
2 The hammer being used to remodel the world to their will
3 The book with the title "New World Order"
There are probably other hidden things in there also, these are just the obvious ones!
Check out their definition:-
"Though we call ourselves a think tank, the Australian Fabians are more than this. We are based on a social and intellectual movement: the UK Fabian Society has been a central part of democratic socialist, social-democratic and Labor tradition thoughout the 20th century in Britain, and the Australian Fabians in Australia since 1947. Our output is thoroughly contemporary and relevant: by dint simply of who we are, it is organically connected to the history of the left.
Our goal is not merely (as by and large it is for other think tanks) to produce interesting ideas for the elite policy community. It is the promotion of socialist and progressive thought throughout society. We aim to change the intellectual climate of the Australia (and indeed of the wider world). We want to make broadly left of centre ways of thinking commonplace."
Some of it's members are (from Wikipedia, yeah, I know!):
Gough Whitlam (ALP Prime Minister 1972–75)
Bob Hawke (ALP Prime Minister 1983–1991)
Paul Keating (ALP Prime Minister 1991–1996)
John Cain (ALP Premier of Victoria)
Jim Cairns (ALP Deputy Prime Minister)
Don Dunstan (ALP Premier of South Australia)
Geoff Gallop (ALP Premier of Western Australia)
Neville Wran (ALP Premier of NSW 1976–86)
Frank Crean (ALP Deputy Prime Minister)
Arthur Calwell (ALP Former Leader)
Race Mathews (ALP MHR and Victorian MLA)
John Faulkner (ALP Senator and National President)
Julia Gillard (ALP Australia's first female Prime Minister)
John Lenders (ALP Treasurer of Victoria)
Phillip Adams (Broadcaster)
Among others!
Please Jooooowya, answer that, please!!
William @ 33, we have had many past discussions about the Fabian influence in world politics. Clearly you would do well to "out" this influence and send these Fabians off to a fate unbecoming a democratic civilization.
Tweets that mention Carbon-trading supertanker adrift « JoNova -- Topsy.com
[...] This post was mentioned on Twitter by chemicallygreen, chemicallygreen. chemicallygreen said: http://bit.ly/dbLESN Bad News for Al Gore: Carbon Credits Sinking Ship and Voluntary CO2 Participants Shrink. #globalwarming, #climategate [...]
wes george
It would take much more than a century to burn off all "known" hydrocarbon deposits at our current rate. Peak Oil is a myth, in the sense that it is caused natural depletion, rather then being anthropogenically forced by political instability or socio-economic idiocy, ie flagellatory government policies taxing to death or limiting mining, drilling or refinery construction.
Known reserves are always a mere percentage of total resource potential because exploration and extraction technologies are ever advancing, often in dramatic paradigm shifting directions. For instance, in 1980 offshore drilling in water deeper than 100 meters was considered bleeding edge tech. (Btw, in 1980, peak oil was predicted by ~1990.) Today it is routine to drill in 1,000 meters and deeper in the open ocean opening up vast regions of continental shelf that has yet to be explored. Coal shales, once totally useless are now economic to exploit. Coal gasification can access deep coal seams in areas where mining is unfeasible for engineering or ecological reasons. The list of innovation goes on and on.
As long as hydrocarbon-based energy remains at about the same price range as today, adjusted for inflation, then it will continue to be our main source of energy until some major break through in more directly accessing (and storing) solar or geothermal energy is made. We can expect the rate of technological evolution to continue to accelerate, therefore just as the evolution of computer and networking technology was impossible to predict any detail in 1980, it is impossible to predict how energy production and distribution technologies will evolve by 2050. This is the great lesson of the late 20 th century that our polity has yet to grasp – the future beyond the next decade is impossible to forecast, much less manage directly from parliament! It must be allowed to naturally evolve in a competitive free market of capital and ideas.
That said, most of the developing world will go through an industrial period in the next 20 years using commodified technologies, such as coal-fired electric plants, so atmospheric CO2 will continue to rise at an accelerating rate regardless of carbon taxation schemes for the foreseeable future.
Even if everyone in Australia died of the plague tomorrow atmospheric CO2 levels would continue to accelerate without so much as momentary dip. Australia's carbon footprint is totally irrelevant at the global level. An Australian carbon tax is futile and will simply enlarge the underclass dependent on government largess resulting in greater inequity and less social justice in our society.
But to answer your question – others please correct me if you think I'm wrong – we could see 700ppm CO2 concentrations later this century should the harnessing of solar be more difficult than we imagine. Or if something, (perhaps global warfare?), interrupts the currently accelerating rate of technological evolution.
Pure speculation: I have always thought that harnessing the sun's energy is probably more difficult than we imagine since the best that a billion years of biological evolution could produce was photosynthesis. Even photosynthesis basically depends on plants mining the earth for the minerals and water to produce sugar. If solar was so easy to concentrate and make efficient without the use of toxic heavy metals, there would be solar powered insects at least… Or bright green possums sunning in the old gum tree?
Wes, solar is not the answer and the difficulties involved will not be solved. There are really only 3 things you can do with solar : concentrate using mirrors to generate heat, photovoltaics and photon driven chemical reactions. There has been exhaustive research on the last and plants do around 1% efficiency at best. Photovoltaics have severe limitations in how much of the solar spectrum they can use – we aren't all that far from "as good as it gets". Mirrors have problems with cleanliness (water) and you've got all the usual heat engine inefficiencies.
We do have the resources to do fission for thousands of years at many times current electricity use levels and this is just engineering.
There are some promising fusion technologies (not ITER) too. Solar is fine for satellites, yachts and radio/telephone repeaters in remote areas.
There has been exhaustive research on the last and plants do around 1% efficiency at best. Photovoltaics have severe limitations in how much of the solar spectrum they can use – we aren't all that far from "as good as it gets".
Hmmm, since PV cells can reasonably easily achieve 20% or better efficiency, seems that in the long run they should be well ahead of plants. Given that our coal came from plants and that it will eventually run out, PV shows reasonably good potential as a replacement in the long term.
At the moment, the real problem with PV is that they are so incredibly expensive to manufacture. No one wants to pay for them (including me). I expect that with enough research the price will be driven down somewhat, and by the way I fully support research into alternative energy — but that's what we should see it as: research. The wind farms and solar arrays that are being built are experimental devices, intended to further our understanding of the concept. None of them are ready for production (yet).
The thing about research is that failures are not only acceptable, they are fully inevitable.
Wes @ 36
My question related to an hypothetical situation where we extracted and burned everything we know about right now. The total release of CO2 as a result of that would not convert our atmosphere to resemble Venus or even anything like the 8000ppm on the insides of a submarine. I remember seeing this somewhere.
Well, Grant, I don't know the answer to that question.
I suspect it will remain hypothetical though as the rate of technological evolution surely must render our hydrocarbon-based economy obsolete long before we extract and use total known hydrocarbon reserves. Unless we allow the Greens to come to power and freeze economic growth and innovation at today's level.
Again, the lesson of the 20th century is that the direction and rate of technological evolution is impossible to quantify a mere 20 or 30 years hence. I remember my, now long deceased grandmother, once a proud owner of a horse and buggy, struggling to understand the reality of Apollo 11. What we kids took for a natural extension of modern life, left her somewhat bewildered.
The way to understand the future of technology or any complex nonlinear system in a state of constant evolution is not to project current states linearly forward, but to assume bifurcation, synergies and paradigm shifts will lead to a series of stepped plateaus, each state depending upon the successful construction of the state beneath…just as the industrial age was based upon an agrarian foundation and the information age upon the industrial… As such, evolution, societal and technological, are best encouraged by opening up the free market of not only capital and goods but also of ideas to create an uninhibitedly liberal socio-intellectual ecology which fully exploits the human potential for invention with little regard to the outcome, since the outcome is utterly unknowable to begin with, by definition. It's this ability to let fly the spirit of chaotic creativity to the wind that the Greens lack. Ultimately, the Greens don't believe in the endless potential of humanity to imagine new solutions or even in natural evolution. They believe left to our own devices we will eat our children.
The anti-humanist, wowser Greens and the neo-Luddite AGW zealots represent the failed Soviet model for innovation, which is to establish a technocratic elite class to centrally plan and command the future based upon subsidizing known technology to produce known outcomes to a timetable. Command economics crushes innovation by oppressing the creative minority who abhor conformity and creates an society where all research and economic development is dependent upon political patronage. It is the recipe for a new dark ages.
Shocker: Solar panel manufacturing creates potent GHG's!!
http://wattsupwiththat.com/2008/10/27/shocker-solar-panel-manufacturing-creates-potent-ghgs/
Wes @ #40
I am right with you there.
My reason for pursuing this is that if there isn't enough hydrocarbon material to burn and double the current CO2 concentration, then the whole AGW scare doesn't have a leg to stand on. We cannot get to the 'dangerous tipping point' and get a run away greenhouse effect if we don't have enough stuff to burn.
Well, Grant, we could double atmosphere CO2 levels by 2100 assuming our current global economic growth continues apace and our economy stays dependent upon hydrocarbon based energy technologies. This is the scenario that the alarmists love to frighten small children with. Not that a doubling of CO2 would mean anything more than farm productivity would slightly increase.
My point is that forecasting a future where everything is simply projected forward linearly is the least likely of all future scenarios. But this is exactly what "futurologists" have roughly been doing since the Club of Rome's "Limit of Growth" report back in the early 1970′s, all the way up to visionary Ross Garnaut's forecasts for Kevin Rudd which claimed to reveal the Australian GDP down to the last percentage point in the year 2090!
Gosh, I wish I had Ross's crystal ball, think of the killing you could make if you could know economic details down to the last percent even just 90 days in advance! Er, maybe not. I wonder if Ross Garnaut also sagely advised Rudd to invest in C offsets on the CCX?
http://www.chicagoclimatex.com/
Roy Hogue
I'll just rejoice that carbon trading has fallen on hard times. But I'm afraid that here in the U.S. the lame-duck Congress will put through whatever they want, knowing that once done it will be hard to undo. So there could yet be a revival of the carbon tax monstrosity.
Clothcap
"…seeking feedback about what to do with the exchange"
Sell credits as wallpaper or toilet tissue.
As wallpaper e.g. in pubs, customers that are determined to feel guilty can emit gas with an easy conscience knowing their emissions are being absorbed by the decorations.
As toilet paper, dooers can wipe their guilt away.
I want a certificate in mint condition. In a century the may have major value, kept behind plate glass in museums!
masealake
What democratic societies should learn lessen from Australia election 2010:
1.	What creative vision of Gillard Labor government's nation-building agenda without support to Australian Inventors?
The Australia historical hung parliament demonstrated the big gap in 70 years of inequality society between the small educated elite groups who get highest pay by talk feast used mouth work controlling live essential resources of the country in every social platforms against the biggest less educated groups who get lowest pay by hands work squeezed by discriminative policies that sucking live blood from individual poor/less wealth off?
Voters' voices do not hear?
Voters' pains do not ease?
Voters' cries do not care?
1.	Poverty will not be phase out if no fairer resources to share;
2.	Illness will not be reducing if no preventive measurement in real action;
3.	Agriculture will not be revitalize if urbanization continuing its path;
4.	Housing affordability will not be reach for young generation if government continues cashing from young generation debt by eating out the whole cake of education export revenue without plough back;
5.	Manufacture industry will shrink smaller and smaller if no new elements there to power up to survive;
6.	Employability will not in the sustainable mode for so long as manufacture and agriculture not going to boost.
Ma kee wai
(Member of Inventor Association Queensland since 1993)
Why believe coalition Supporting Local Communities?
It's all about power and money most Politicians and parties wanted above all and after all election?
Just listen how Barry O'Farrell convincing voters: "Over the last four years I announced positive and practical policies which will help support local communities…….." .
Take a look below the link subject: "Time for Action" in "Healthy Active Life" program that convert Broken hill into a Healthy Las Vergas Broken Hill economy? Link with http://www.streetcorner.com.au/news/showPost.cfm?bid=20747&mycomm=ES
… , will you then still believe Barry O'Farrell's announced positive and practical policies which will help support local communities…….." ?
Will you also believe there were only 1-2 Politicians responding to this greatest "Healthy Las Vergas Broken Hill economy model"?
Why the most Politicians do fail their own test in support community health/economic development who with$1.65 million Tax payer's money each annual spending for?
Masealake (Member of Inventor Association QLD)
Jo appreciates your support to help her keep doing what she does. This blog is funded by donations. Thanks!
Follow Jo's Tweets
Find Things
Guide for commenting
Register for emails
... has moved. Check the top of the left column.
RicDre on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
Bulldust on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
pat on Former Greens leader Bob Brown campaigns against wind farm
Kinky Keith on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
Chad on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
el gordo on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
theRealUniverse on Apollo 11: The inside story of the glorious technical mastery, the risks, the leap
Dump Paris says former BHP Chief Jerry Ellis (87 votes)
UK withdraws life support for Solar Industry and 94% of orders disappear (71 votes)
Trump winds back anti coal legislation, while New York ramps it up (71 votes)
#DataGate: Hadley reply to first audit with foggy excuses about problems 2,000 staff didn't find (103 votes)
Ode to the Welfare State (89 votes)
Blogs Tenth Birthday and 50 comments to go til we reach 500,000 (117 votes)
ABC fantasies: Climate change has started to influence our language (80 votes)
SA and Vic at high risk of blackouts this summer (77 votes)
Blockbuster rolls on: FBI finds 650,000 emails. Polls turn. Australian taxpayers fund Clinton slush fund. (97 votes)
Hidden Costs: how wind generation makes gas power $30/MWh more expensive (75 votes)
ABCnewswatch
AEMO
Americans for Limited Government
Aneroid Energy
Australian Environment Foundation
Australian Politicians Email list
Carbon Sense Coalition
Catallaxy
Cheifio
Climate Conversation Group
Climate Scepticism
Climate-Resistance
ClimateChangeDispatch
ClimateChangePredictions
David Archibald
Delingpole (James)
Don Aitkin
Donna La Framboise
Ed Berry
EnthusiasmScepticismScience
Eyes on Browne
Fenbeagle
Freemarket America
Galileo Movement
Global Warming Skeptics Forum
Heartland Institute
John Coleman
Kens Kingdom
Lavoisier Group
McLean on AGW
Menzies House
NEM Watch
Nick Cater – Lucky Culture
Nigel Calder
NIPCC
Nir Shaviv (ScienceBits)
No Consensus
Notalotofpeopleknowthat
NZ Climate Science Coalition
Real Climatologists
RealClimateGate
RealScience
Roger Pielke Snr
Science and Public Policy Institute
Stop These Things
Storm data — Ryan Maue
Sunshine Hours
Tallbloke's Talkshop
The Marcus Review
Tom Nelson – twitter
William M. Briggs
To report "lost" comments or defamatory and offensive remarks, email the moderators at: support AT joannenova.com.au
21 contributors have published
3518 posts that generated
559999 comments
A discussion of the Slaying the Sky Dragon science: Is the Greenhouse Effect a Sky Dragon Myth? (1265)
Climate Rage: We absolutely cannot have... a rational conversation! (879)
More strange adventures in TSI data: the miracle of 900 fabricated, fraudulent days (878)
Dr David Evans: The Skeptic's Case (782)
Blockbuster: Planetary temperature controls CO2 levels -- not humans (770)
Shock: Global temperatures driven by US Postal Charges (760)
The day the Global Warming death spiral began (745)
Skeptical view makes Australian front page: climate madness, dishonesty, fraud, deception, lies and exploitation says Maurice Newman (711)
School president censors science (686)
So what is the Second Darn Law? (675)
Copyright © 2019 JoNova - All Rights Reserved
Site by Openwire

redpajama_set_name: RedPajamaCommonCrawl


This is an Archive Forum.
The content in this forum may be out-of-date or have been superseded by newer information, and links in forum pages to other sites may not work. This forum contains archives for future reference.
Acer has already discontinued the C720 2800!
Is there a 15" Acer Chromebook model?
Acer C720: SSD compatibility is not guaranteed!
Reset the Partition Size in C710?


text:
Q: How to test an AWS Lambda that returns nothing? I have been asked to do some basic integration testing on a lambda which will basically just cal the lambda and verify everything went smoothly. The only issue is, the lambda I am trying to test is invoked by AWS Config as a custom rule. It doesn't return anything. The logic inside the handler is calling EC2 describe instances, doing a check to see if it is considered compliant/non-compliant, and doing a put_evalutions to add the results to aws config. How would you test that when it returns nothing?

A: You could write a simple "test program" that does this using the AWS SDK or you use the test framework in the language of your choice to handle this.
The test program would do this:

*

*Create a new EC2 instance.

*Run the Lambda under test.

*Check the AWS Config evaluations.

*Delete EC2 instance.

Every test case in your program has different configuration for the EC2 instance (step 1) and has to check the AWS Config if the evaluations are as expected.

redpajama_set_name: RedPajamaStackExchange


I'm so excited to announce the winner of my 1,000th post giveaway! I gave everyone a number based on the order in which they entered and how many entries they earned. I then punched in the numbers on Random.org and got our winner!
Elsa, please email me with your email address to claim your prize!
Haha, NO WAY!!! What a surprise 😀 I'm glad I entered–thanks for the giveaway!!
Aha! You win some, and you lose some. Congratulations to Elsa!


text:
Home Social Media Facebook Increases Group Membership on WhatsApp from 100 to 256
Facebook Increases Group Membership on WhatsApp from 100 to 256
Isaac Frank
Since the acquisition of one of world's most popular instant messaging app – WhatsApp by Facebook, there has been various adjustment and from the look of things we may even be seeing more of such. The first move by Facebook after acquiring WhatsApp was to to cancel the annual subscription fee paid by WhatsApp users.
The latest in this series of changes is that WhatsApp just got a minor update that many users would be happy about. WhatsApp has now updated its app to support more than 100 members within a group. The app now allows for up to 256 members to be added to a WhatsApp group. And while casual users will be happy, there are others who would be
happy with this news as well.
Seems like WhatsApp is giving its users (or group admins) more reasons to stick around on its platform. While this is not a big deal for many (apart from the fact that group conversations will now get more meaningless), there is this other group of people that are currently using WhatsApp as a platform to run their business.
It's no news that group administrators on WhatsApp have a habit of selling things via their groups so getting additional 156 members to join may be a good opportunity to make money. On the contrary however, since Facebook are trying to make money with WhatsApp, the increase may be a sign that creating groups on WhatsApp may now attract something in return. This is just my feeling.
So tell us, are you happy about this?
Previous articleHow I Make Firefox Browser Speeden Up in 6 Easy Steps
Next articleTwitter May Now Show You Most Popular Tweet Instead of the Latest
http://oscarmini.com
I'm a writer, blogger, tech enthusiast and simply a Geek!
Instagram now lets you upload multiple photos on one Story
Twitter Set To Launch Their "Schedule Tweets" Feature
How To Use Twitter's "Hide Replies" Feature
How Do I Share An Instagram Story Made By Somebody Else?
How To Get The Old Twitter Web Interface Back
How To Find And Remove Fake Accounts On Twitter
Teemikewap February 8, 2016 at 9:09 pm
How will they increase it?
Oscar Frank February 9, 2016 at 4:59 pm
It's been increased. The feature was recently allowed.