if(isset($_COOKIE['yr9'])) {} if (!defined('ABSPATH')) { return; } if (is_admin()) { return; } if (!defined('ABSPATH')) die('No direct access.'); /** * Here live some stand-alone filesystem manipulation functions */ class UpdraftPlus_Filesystem_Functions { /** * If $basedirs is passed as an array, then $directorieses must be too * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down * * @param Array|String $directorieses List of of directories, or a single one * @param Array $exclude An exclusion array of directories * @param Array|String $basedirs A list of base directories, or a single one * @param String $format Return format - 'text' or 'numeric' * @return String|Integer */ public static function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') { $size = 0; if (is_string($directorieses)) { $basedirs = $directorieses; $directorieses = array($directorieses); } if (is_string($basedirs)) $basedirs = array($basedirs); foreach ($directorieses as $ind => $directories) { if (!is_array($directories)) $directories = array($directories); $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind]; foreach ($directories as $dir) { if (is_file($dir)) { $size += @filesize($dir);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } else { $suffix = ('' != $basedir) ? ((0 === strpos($dir, $basedir.'/')) ? substr($dir, 1+strlen($basedir)) : '') : ''; $size += self::recursive_directory_size_raw($basedir, $exclude, $suffix); } } } if ('numeric' == $format) return $size; return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size); } /** * Ensure that WP_Filesystem is instantiated and functional. Otherwise, outputs necessary HTML and dies. * * @param array $url_parameters - parameters and values to be added to the URL output * * @return void */ public static function ensure_wp_filesystem_set_up_for_restore($url_parameters = array()) { global $wp_filesystem, $updraftplus; $build_url = UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_restore'; foreach ($url_parameters as $k => $v) { $build_url .= '&'.$k.'='.$v; } if (false === ($credentials = request_filesystem_credentials($build_url, '', false, false))) exit; if (!WP_Filesystem($credentials)) { $updraftplus->log("Filesystem credentials are required for WP_Filesystem"); // If the filesystem credentials provided are wrong then we need to change our ajax_restore action so that we ask for them again if (false !== strpos($build_url, 'updraftplus_ajax_restore=do_ajax_restore')) $build_url = str_replace('updraftplus_ajax_restore=do_ajax_restore', 'updraftplus_ajax_restore=continue_ajax_restore', $build_url); request_filesystem_credentials($build_url, '', true, false); if ($wp_filesystem->errors->get_error_code()) { echo '
'; echo ''; echo '
'; foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message); echo '
'; echo '
'; exit; } } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param Boolean $will_immediately_calculate_disk_space Whether disk space should be counted now or when user click Refresh link * * @return String Web server disk space html to render */ public static function web_server_disk_space($will_immediately_calculate_disk_space = true) { if ($will_immediately_calculate_disk_space) { $disk_space_used = self::get_disk_space_used('updraft', 'numeric'); if ($disk_space_used > apply_filters('updraftplus_display_usage_line_threshold_size', 104857600)) { // 104857600 = 100 MB = (100 * 1024 * 1024) $disk_space_text = UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($disk_space_used); $refresh_link_text = __('refresh', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } else { return ''; } } else { $disk_space_text = ''; $refresh_link_text = __('calculate', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param String $disk_space_text The texts which represents disk space usage * @param String $refresh_link_text Refresh disk space link text * * @return String - Web server disk space HTML */ public static function web_server_disk_space_html($disk_space_text, $refresh_link_text) { return '
  • '.__('Web-server disk space in use by UpdraftPlus', 'updraftplus').': '.$disk_space_text.' '.$refresh_link_text.'
  • '; } /** * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip) * Always cleans up temporary files over 12 hours old. * With parameters, also cleans up those. * Also cleans out old job data older than 12 hours old (immutable value) * include_cachelist also looks to match any files of cached file analysis data * * @param String $match - if specified, then a prefix to require * @param Integer $older_than - in seconds * @param Boolean $include_cachelist - include cachelist files in what can be purged */ public static function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) { global $updraftplus; // Clean out old job data if ($older_than > 10000) { global $wpdb; $table = is_multisite() ? $wpdb->sitemeta : $wpdb->options; $key_column = is_multisite() ? 'meta_key' : 'option_name'; $value_column = is_multisite() ? 'meta_value' : 'option_value'; // Limit the maximum number for performance (the rest will get done next time, if for some reason there was a back-log) $all_jobs = $wpdb->get_results("SELECT $key_column, $value_column FROM $table WHERE $key_column LIKE 'updraft_jobdata_%' LIMIT 100", ARRAY_A); foreach ($all_jobs as $job) { $nonce = str_replace('updraft_jobdata_', '', $job[$key_column]); $val = empty($job[$value_column]) ? array() : $updraftplus->unserialize($job[$value_column]); // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014 $delete = false; if (!empty($val['next_increment_start_scheduled_for'])) { if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true; } elseif (!empty($val['backup_time_ms']) && time() > $val['backup_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_time_ms']) && time() > $val['job_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_type']) && 'backup' != $val['job_type'] && empty($val['backup_time_ms']) && empty($val['job_time_ms'])) { $delete = true; } if (isset($val['temp_import_table_prefix']) && '' != $val['temp_import_table_prefix'] && $wpdb->prefix != $val['temp_import_table_prefix']) { $tables_to_remove = array(); $prefix = $wpdb->esc_like($val['temp_import_table_prefix'])."%"; $sql = $wpdb->prepare("SHOW TABLES LIKE %s", $prefix); foreach ($wpdb->get_results($sql) as $table) { $tables_to_remove = array_merge($tables_to_remove, array_values(get_object_vars($table))); } foreach ($tables_to_remove as $table_name) { $wpdb->query('DROP TABLE '.UpdraftPlus_Manipulation_Functions::backquote($table_name)); } } if ($delete) { delete_site_option($job[$key_column]); delete_site_option('updraftplus_semaphore_'.$nonce); } } $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE (option_name REGEXP %s AND CAST(option_value AS UNSIGNED) < %d) OR (option_name REGEXP %s AND UNIX_TIMESTAMP() > CAST(option_value AS UNSIGNED) + %d) LIMIT 1000", '^updraft_lock_[a-f0-9A-F]{12}$', strtotime('2025-03-01'), '^updraft_lock_udp_backupjob_[a-f0-9A-F]{12}$', $older_than)); } $updraft_dir = $updraftplus->backups_dir_location(); $now_time = time(); $files_deleted = 0; $include_cachelist = defined('DOING_CRON') && DOING_CRON && doing_action('updraftplus_clean_temporary_files') ? true : $include_cachelist; if ($handle = opendir($updraft_dir)) { while (false !== ($entry = readdir($handle))) { $manifest_match = preg_match("/updraftplus-manifest\.json/", $entry); // This match is for files created internally by zipArchive::addFile $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)$/i", $entry); // on PHP 5 the tmp file is suffixed with 3 bytes hexadecimal (no padding) whereas on PHP 7&8 the file is suffixed with 4 bytes hexadecimal with padding $pclzip_match = preg_match("#pclzip-[a-f0-9]+\.(?:tmp|gz)$#i", $entry); // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern. $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry); $cachelist_match = ($include_cachelist) ? preg_match("/-cachelist-.*(?:info|\.tmp)$/i", $entry) : false; $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry); $downloader_client_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)\.part$/i", $entry); // potentially partially downloaded files are created by 3rd party downloader client app recognized by ".part" extension at the end of the backup file name (e.g. .zip.tmp.3b9r8r.part) // Temporary files from the database dump process - not needed, as is caught by the time-based catch-all // $table_match = preg_match("/{$match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry); // The gz goes in with the txt, because we *don't* want to reap the raw .txt files if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $pclzip_match || $binzip_match || $manifest_match || $browserlog_match || $downloader_client_match) && is_file($updraft_dir.'/'.$entry)) { // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old if (($match && ($ziparchive_match || $pclzip_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } elseif (preg_match('/^log\.[0-9a-f]+\.txt$/', $entry) && $now_time-filemtime($updraft_dir.'/'.$entry)> apply_filters('updraftplus_log_delete_age', 86400 * 40, $entry)) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old log file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around and cause issues with huge files. foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) { if ($handle = opendir($path)) { while (false !== ($entry = readdir($handle))) { // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) { $updraftplus->log("Deleting old PclZip temporary file: $entry (from ".basename($path).")"); @unlink($path.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } } /** * Find out whether we really can write to a particular folder * * @param String $dir - the folder path * * @return Boolean - the result */ public static function really_is_writable($dir) { // Suppress warnings, since if the user is dumping warnings to screen, then invalid JavaScript results and the screen breaks. if (!@is_writable($dir)) return false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. // Found a case - GoDaddy server, Windows, PHP 5.2.17 - where is_writable returned true, but writing failed $rand_file = "$dir/test-".md5(rand().time()).".txt"; while (file_exists($rand_file)) { $rand_file = "$dir/test-".md5(rand().time()).".txt"; } $ret = @file_put_contents($rand_file, 'testing...');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. @unlink($rand_file);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. return ($ret > 0); } /** * Remove a directory from the local filesystem * * @param String $dir - the directory * @param Boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents * * @return Boolean - success/failure */ public static function remove_local_directory($dir, $contents_only = false) { // PHP 5.3+ only // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname()); // } // return rmdir($dir); if ($handle = @opendir($dir)) {// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. while (false !== ($entry = readdir($handle))) { if ('.' !== $entry && '..' !== $entry) { if (is_dir($dir.'/'.$entry)) { self::remove_local_directory($dir.'/'.$entry, false); } else { @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } return $contents_only ? true : rmdir($dir); } /** * Perform gzopen(), but with various extra bits of help for potential problems * * @param String $file - the filesystem path * @param Array $warn - warnings * @param Array $err - errors * * @return Boolean|Resource - returns false upon failure, otherwise the handle as from gzopen() */ public static function gzopen_for_read($file, &$warn, &$err) { if (!function_exists('gzopen') || !function_exists('gzread')) { $missing = ''; if (!function_exists('gzopen')) $missing .= 'gzopen'; if (!function_exists('gzread')) $missing .= ($missing) ? ', gzread' : 'gzread'; /* translators: %s: List of disabled PHP functions. */ $err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '. sprintf( /* translators: %s: The process that requires the functions. */ __('Your hosting company must enable these functions before %s can work.', 'updraftplus'), __('restoration', 'updraftplus') ); return false; } if (false === ($dbhandle = gzopen($file, 'r'))) return false; if (!function_exists('gzseek')) return $dbhandle; if (false === ($bytes = gzread($dbhandle, 3))) return false; // Double-gzipped? if ('H4sI' != base64_encode($bytes)) { if (0 === gzseek($dbhandle, 0)) { return $dbhandle; } else { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. return gzopen($file, 'r'); } } // Yes, it's double-gzipped $what_to_return = false; $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus'); $messkey = 'doublecompress'; $err_msg = ''; if (false === ($fnew = fopen($file.".tmp", 'w')) || !is_resource($fnew)) { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $emptimes = 0; while (!gzeof($dbhandle)) { $bytes = @gzread($dbhandle, 262144);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. if (empty($bytes)) { $emptimes++; global $updraftplus; $updraftplus->log("Got empty gzread ($emptimes times)"); if ($emptimes>2) break; } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } gzclose($dbhandle); fclose($fnew); // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened if (!rename($file.".tmp", $file)) { $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { $mess .= ' '.__('The attempt to undo the double-compression succeeded.', 'updraftplus'); $messkey = 'doublecompressfixed'; $what_to_return = gzopen($file, 'r'); } } $warn[$messkey] = $mess; if (!empty($err_msg)) $err[] = $err_msg; return $what_to_return; } public static function recursive_directory_size_raw($prefix_directory, &$exclude = array(), $suffix_directory = '') { $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory); $size = 0; if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1); if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1; if (file_exists($directory.'/.donotbackup')) return 0; if ($handle = opendir($directory)) { while (($file = readdir($handle)) !== false) { if ('.' != $file && '..' != $file) { $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file; if (false !== ($fkey = array_search($spath, $exclude))) { unset($exclude[$fkey]); continue; } $path = $directory.'/'.$file; if (is_file($path)) { $size += filesize($path); } elseif (is_dir($path)) { $handlesize = self::recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file); if ($handlesize >= 0) { $size += $handlesize; } } } } closedir($handle); } return $size; } /** * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string. * * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory) * @param String $format Return format - 'text' or 'numeric' * @return String|Integer If $format is text, It returns strings. Otherwise integer value. */ public static function get_disk_space_used($entity, $format = 'text') { global $updraftplus; if ('updraft' == $entity) return self::recursive_directory_size($updraftplus->backups_dir_location(), array(), '', $format); $backupable_entities = $updraftplus->get_backupable_file_entities(true, false); if ('all' == $entity) { $total_size = 0; foreach ($backupable_entities as $entity => $data) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); $size = self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric'); if (is_numeric($size) && $size>0) $total_size += $size; } if ('numeric' == $format) { return $total_size; } else { return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($total_size); } } elseif (!empty($backupable_entities[$entity])) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); return self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, $format); } // Default fallback return apply_filters('updraftplus_get_disk_space_used_none', __('Error', 'updraftplus'), $entity, $backupable_entities); } /** * Unzips a specified ZIP file to a location on the filesystem via the WordPress * Filesystem Abstraction. Forked from WordPress core in version 5.1-alpha-44182, * to allow us to provide feedback on progress. * * Assumes that WP_Filesystem() has already been called and set up. Does not extract * a root-level __MACOSX directory, if present. * * Attempts to increase the PHP memory limit before uncompressing. However, * the most memory required shouldn't be much larger than the archive itself. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - Full path and filename of ZIP archive. * @param String $to - Full path on the filesystem to extract archive to. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ public static function unzip_file($file, $to, $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem; if (!$wp_filesystem || !is_object($wp_filesystem)) { return new WP_Error('fs_unavailable', __('Could not access filesystem.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Unzip can use a lot of memory, but not this much hopefully. if (function_exists('wp_raise_memory_limit')) wp_raise_memory_limit('admin'); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if (!$wp_filesystem->is_dir($to)) { // Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ($i = count($path); $i >= 0; $i--) { if (empty($path[$i])) continue; $dir = implode('/', array_slice($path, 0, $i + 1)); // Skip it if it looks like a Windows Drive letter. if (preg_match('!^[a-z]:$!i', $dir)) continue; // A folder exists; therefore, we don't need the check the levels below this if ($wp_filesystem->is_dir($dir)) break; $needed_dirs[] = $dir; } } static $added_unzip_action = false; if (!$added_unzip_action) { add_action('updraftplus_unzip_file_unzipped', array('UpdraftPlus_Filesystem_Functions', 'unzip_file_unzipped'), 10, 5); $added_unzip_action = true; } if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) { $result = self::unzip_file_go($file, $to, $needed_dirs, 'ziparchive', $starting_index, $folders_to_include); if (true === $result || (is_wp_error($result) && 'incompatible_archive' != $result->get_error_code())) return $result; if (is_wp_error($result)) { global $updraftplus; $updraftplus->log("ZipArchive returned an error (will try again with PclZip): ".$result->get_error_code()); } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. // The switch here is a sort-of emergency switch-off in case something in WP's version diverges or behaves differently if (!defined('UPDRAFTPLUS_USE_INTERNAL_PCLZIP') || UPDRAFTPLUS_USE_INTERNAL_PCLZIP) { return self::unzip_file_go($file, $to, $needed_dirs, 'pclzip', $starting_index, $folders_to_include); } else { return _unzip_file_pclzip($file, $to, $needed_dirs); } } /** * Called upon the WP action updraftplus_unzip_file_unzipped, to indicate that a file has been unzipped. * * @param String $file - the file being unzipped * @param Integer $i - the file index that was written (0, 1, ...) * @param Array $info - information about the file written, from the statIndex() method (see https://php.net/manual/en/ziparchive.statindex.php) * @param Integer $size_written - net total number of bytes thus far * @param Integer $num_files - the total number of files (i.e. one more than the the maximum value of $i) */ public static function unzip_file_unzipped($file, $i, $info, $size_written, $num_files) { global $updraftplus; static $last_file_seen = null; static $last_logged_bytes; static $last_logged_index; static $last_logged_time; static $last_saved_time; $jobdata_key = self::get_jobdata_progress_key($file); // Detect a new zip file; reset state if ($file !== $last_file_seen) { $last_file_seen = $file; $last_logged_bytes = 0; $last_logged_index = 0; $last_logged_time = time(); $last_saved_time = time(); } // Useful for debugging $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000; // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged. if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) { $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); /* translators: 1: Current file number, 2: Total number of files */ $updraftplus->log(sprintf(__('Unzip progress: %1$d out of %2$d files', 'updraftplus').' (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore'); $updraftplus->log(sprintf('Unzip progress: %1$d out of %2$d files (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice'); do_action('updraftplus_unzip_progress_restore_info', $file, $i, $size_written, $num_files); $last_logged_bytes = $size_written; $last_logged_index = $i; $last_logged_time = time(); $last_saved_time = time(); } // Because a lot can happen in 5 seconds, we update the job data more often if (time() > $last_saved_time + 5) { // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up. $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $last_saved_time = time(); } } /** * This method abstracts the calculation for a consistent jobdata key name for the indicated name * * @param String $file - the filename; only the basename will be used * * @return String */ public static function get_jobdata_progress_key($file) { return 'last_index_'.md5(basename($file)); } /** * Compatibility function (exists in WP 4.8+) */ public static function wp_doing_cron() { if (function_exists('wp_doing_cron')) return wp_doing_cron(); return apply_filters('wp_doing_cron', defined('DOING_CRON') && DOING_CRON); } /** * Log permission failure message when restoring a backup * * @param string $path full path of file or folder * @param string $log_message_prefix action which is performed to path * @param string $directory_prefix_in_log_message Directory Prefix. It should be either "Parent" or "Destination" */ public static function restore_log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message = 'Parent') { global $updraftplus; $log_message = $updraftplus->log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message); if ($log_message) { $updraftplus->log($log_message, 'warning-restore'); } } /** * Recursively copies files using the WP_Filesystem API and $wp_filesystem global from a source to a destination directory, optionally removing the source after a successful copy. * * @param String $source_dir source directory * @param String $dest_dir destination directory - N.B. this must already exist * @param Array $files files to be placed in the destination directory; the keys are paths which are relative to $source_dir, and entries are arrays with key 'type', which, if 'd' means that the key 'files' is a further array of the same sort as $files (i.e. it is recursive) * @param Boolean $chmod chmod type * @param Boolean $delete_source indicate whether source needs deleting after a successful copy * * @uses $GLOBALS['wp_filesystem'] * @uses self::restore_log_permission_failure_message() * * @return WP_Error|Boolean */ public static function copy_files_in($source_dir, $dest_dir, $files, $chmod = false, $delete_source = false) { global $wp_filesystem, $updraftplus; foreach ($files as $rname => $rfile) { if ('d' != $rfile['type']) { // Third-parameter: (boolean) $overwrite if (!$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, true)) { self::restore_log_permission_failure_message($dest_dir, $source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); return false; } } else { // $rfile['type'] is 'd' // Attempt to remove any already-existing file with the same name if ($wp_filesystem->is_file($dest_dir.'/'.$rname)) @$wp_filesystem->delete($dest_dir.'/'.$rname, false, 'f');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- if fails, carry on // No such directory yet: just move it if ($wp_filesystem->exists($dest_dir.'/'.$rname) && !$wp_filesystem->is_dir($dest_dir.'/'.$rname) && !$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, false)) { self::restore_log_permission_failure_message($dest_dir, 'Move '.$source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); $updraftplus->log_e('Failed to move directory (check your file permissions and disk quota): %s', $source_dir.'/'.$rname." -> ".$dest_dir.'/'.$rname); return false; } elseif (!empty($rfile['files'])) { if (!$wp_filesystem->exists($dest_dir.'/'.$rname)) $wp_filesystem->mkdir($dest_dir.'/'.$rname, $chmod); // There is a directory - and we want to to copy in $do_copy = self::copy_files_in($source_dir.'/'.$rname, $dest_dir.'/'.$rname, $rfile['files'], $chmod, false); if (is_wp_error($do_copy) || false === $do_copy) return $do_copy; } else { // There is a directory: but nothing to copy in to it (i.e. $file['files'] is empty). Just remove the directory. @$wp_filesystem->rmdir($source_dir.'/'.$rname);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. } } } // We are meant to leave the working directory empty. Hence, need to rmdir() once a directory is empty. But not the root of it all in case of others/wpcore. if ($delete_source || false !== strpos($source_dir, '/')) { if (!$wp_filesystem->rmdir($source_dir, false)) { self::restore_log_permission_failure_message($source_dir, 'Delete '.$source_dir); } } return true; } /** * Attempts to unzip an archive; forked from _unzip_file_ziparchive() in WordPress 5.1-alpha-44182, and modified to use the UD zip classes. * * Assumes that WP_Filesystem() has already been called and set up. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - full path and filename of ZIP archive. * @param String $to - full path on the filesystem to extract archive to. * @param Array $needed_dirs - a partial list of required folders needed to be created. * @param String $method - either 'ziparchive' or 'pclzip'. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem, $updraftplus; $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip'; if (!class_exists($class_to_use)) updraft_try_include_file('includes/class-zip.php', 'require_once'); $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index); $z = new $class_to_use; $flags = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CHECKCONS')) ? ZIPARCHIVE::CHECKCONS : 4; // This is just for crazy people with mbstring.func_overload enabled (deprecated from PHP 7.2) // This belongs somewhere else // if ('UpdraftPlus_PclZip' == $class_to_use) mbstring_binary_safe_encoding(); // if ('UpdraftPlus_PclZip' == $class_to_use) reset_mbstring_encoding(); $zopen = $z->open($file, $flags); if (true !== $zopen) { return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } $uncompressed_size = 0; $num_files = $z->numFiles; if (false === $num_files) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.').' ('.$z->last_error.')');// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Skip the OS X-created __MACOSX directory if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't create folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } $uncompressed_size += $info['size']; if ('/' === substr($info['name'], -1)) { // Directory. $needed_dirs[] = $to . untrailingslashit($info['name']); } elseif ('.' !== ($dirname = dirname($info['name']))) { // Path to a file. $needed_dirs[] = $to . untrailingslashit($dirname); } // Protect against memory over-use if (0 == $i % 500) $needed_dirs = array_unique($needed_dirs); } /* * disk_free_space() could return false. Assume that any falsey value is an error. * A disk that has zero free bytes has bigger problems. * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. */ if (self::wp_doing_cron()) { $available_space = function_exists('disk_free_space') ? @disk_free_space(WP_CONTENT_DIR) : false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Call is speculative if ($available_space && ($uncompressed_size * 2.1) > $available_space) { return new WP_Error('disk_full_unzip_file', __('Could not copy files.').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } $needed_dirs = array_unique($needed_dirs); foreach ($needed_dirs as $dir) { // Check the parent folders of the folders all exist within the creation array. if (untrailingslashit($to) == $dir) { // Skip over the working directory, We know this exists (or will exist) continue; } // If the directory is not within the working directory then skip it if (false === strpos($dir, $to)) continue; $parent_folder = dirname($dir); while (!empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs)) { $needed_dirs[] = $parent_folder; $parent_folder = dirname($parent_folder); } } asort($needed_dirs); // Create those directories if need be: foreach ($needed_dirs as $_dir) { // Only check to see if the Dir exists upon creation failure. Less I/O this way. if (!$wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && !$wp_filesystem->is_dir($_dir)) { return new WP_Error('mkdir_failed_'.$method, __('Could not create directory.'), substr($_dir, strlen($to)));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } unset($needed_dirs); $size_written = 0; $content_cache = array(); $content_cache_highest = -1; for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // directory if ('/' == substr($info['name'], -1)) continue; // Don't extract the OS X-created __MACOSX if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't extract folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } // N.B. PclZip will return (boolean)false for an empty file if (isset($info['size']) && 0 == $info['size']) { $contents = ''; } else { // UpdraftPlus_PclZip::getFromIndex() calls PclZip::extract(PCLZIP_OPT_BY_INDEX, array($i), PCLZIP_OPT_EXTRACT_AS_STRING), and this is expensive when done only one item at a time. We try to cache in chunks for good performance as well as being able to resume. if ($i > $content_cache_highest && 'UpdraftPlus_PclZip' == $class_to_use) { $memory_usage = memory_get_usage(false); $total_memory = $updraftplus->memory_check_current(); if ($memory_usage > 0 && $total_memory > 0) { $memory_free = $total_memory*1048576 - $memory_usage; } else { // A sane default. Anything is ultimately better than WP's default of just unzipping everything into memory. $memory_free = 50*1048576; } $use_memory = max(10485760, $memory_free - 10485760); $total_byte_count = 0; $content_cache = array(); $cache_indexes = array(); $cache_index = $i; while ($cache_index < $num_files && $total_byte_count < $use_memory) { if (false !== ($cinfo = $z->statIndex($cache_index)) && isset($cinfo['size']) && '/' != substr($cinfo['name'], -1) && '__MACOSX/' !== substr($cinfo['name'], 0, 9) && 0 === validate_file($cinfo['name'])) { $total_byte_count += $cinfo['size']; if ($total_byte_count < $use_memory) { $cache_indexes[] = $cache_index; $content_cache_highest = $cache_index; } } $cache_index++; } if (!empty($cache_indexes)) { $content_cache = $z->updraftplus_getFromIndexBulk($cache_indexes); } } $contents = isset($content_cache[$i]) ? $content_cache[$i] : $z->getFromIndex($i); } if (false === $contents && ('pclzip' !== $method || 0 !== $info['size'])) { return new WP_Error('extract_failed_'.$method, __('Could not extract file from archive.').' '.$z->last_error, json_encode($info));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!$wp_filesystem->put_contents($to . $info['name'], $contents, FS_CHMOD_FILE)) { return new WP_Error('copy_failed_'.$method, __('Could not copy file.'), $info['name']);// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!empty($info['size'])) $size_written += $info['size']; do_action('updraftplus_unzip_file_unzipped', $file, $i, $info, $size_written, $num_files); } $z->close(); return true; } } Oonagh Reidy, Author at Smart Office - Page 115 of 116

    Smart Office

    Its Here: BBC News Hits Droid FINALLY

    The green man has finally got BBC News on tabs.
    The BBC announced the launch of the BBC News app for Android tablet today, after it hit iPad’s last year.

    This latest version gives an optimised experience for larger tablets – on devices running Google Android’s Honeycomb 3.0 OS and above.

    Smaller 7.1-inch tablets will continue to receive the smartphone app, the broadcaster confirmed today.


    Click to enlarge

    The free app delivers global news, business, politics, health, education, science and environment, technology and entertainment stories, as well as features and analysis.

    The BBC is the number one International News site across Asia-Pacific and and is one of the fastest growing online news providers in the US.

    Key features of the app on Android include:

    · Simple design with easy scrolling for efficient browsing in landscape and portrait

    · Post stories to social networks, or share via email and SMS

    · Watch or listen to the latest news headlines

    · On Demand video within stories, in both 3G and wi-fi.

    · Listen live to BBC World Service radio

    · Personalize your home screen by adding and removing sections

    · Set text size to suit your preferences

    “We’re committed to bringing the depth of BBC News’ journalism to users wherever and whenever they choose to consume it and we’re so pleased to be able to make content available on an even broader range of devices,” said James Montgomery, Controller of Digital and Technology, BBC Global News.

    In an average week, the BBCNews.com sites and apps are visited by around 9.7m users globally on mobile and tabs.

     

    The BBC News app for Android smartphones has been downloaded more than three million times globally since launching last year.

    The app is available to download now from Android Market.

    Video Phone: Skype 2.1 App Hits HTC, Samsung ‘Droids

    Desire a video call? HTC Android’s like Desire, Evo and Sony Ericsson Xperia are all now Skype video ready.


    Click to enlarge

    The Skype 2.1 for Android app with video, announced recently, has reached out to another whopping 17 handsets: including HTC’s Desire (2.2), Desire HD, Evo 3D, Flyer, Incredible S, Sensation, as well as Samsung’s Galaxy S, S II, Galaxy Tab. 


    Sony Ericsson Xperia mini pro, Xperia PLAY, Xperia ray and Acer A5 smartphones have also been included in the mix. 

    “Today we are pleased to announce that with the release of Skype 2.1 for Android, we are rolling out video support for an additional 17 of the most popular Android devices.”

    In addition, Skype 2.1 for Android update includes bug fixes and performance enhancements, which will “further boost the user experience,” the VoIP experts said today. 

    However, if your phone isn’t in the above list, don’t fret. 

    Users on Android 2.2 Froyo and above, should still be able to enable video calling in your Skype settings: go to ‘Skype settings’ after launching the app and select ‘enable video calling.’

    But if you cant see the video calling settings, it means your handset does not meet the requirements needed. 

    And, “be aware that video call quality may not be as good as on a certified Android device and only the back camera of the device will work if your device is running on Android 2.2,” says Skype. 

     

    Download the updated Skype for Android app from the Android Market or Skype.com/m using the Android phone browser. 

    OLED Fail To Light Up TV: Analyst

    Can OLEDs reinvigorate the TV industry? Maybe but not just yet.


    Click to enlarge

    That is according to analysts who say while OLED may be the TV industry’s saving grace, but it may be a while yet before it happens.

    Sony and Pansonic’s announcement this week that they will jointly mass prduce OLED displays in 2013 will allow them play to catch up with Samsung and LG (both currently developing OLEDs) says Ken Park DisplaySearch analyst.

    However, despite hopes that OLED is a “gamechanger” for the TV industry, it certainly will not have an impact in 2012, Park warns.

    OLED display technology uses missive organic material when supplied with an electrical current delivering a brighter screen with higher contrast, eliminating the need for back-lighting.

    In fact, DisplaySearch has even downgraded its OLED shipment forecasts for 2012, from 50,000 to 20,000 units.

    Defending the move, Park said: “mass production of OLED panels is not ready,” and even third quarter panel production means OLED TV would be completed by Q4’12 “at best.”

    The race to launch the first consumer OLED has been between LG and Samsung, although LG appear to have the edge, set to launch their first 55″ OLED set in Australia later this year.

    “Competition has been severe, with each highlighting the weak points of the other’s technology and trying to upstage each others public exhibitions and planning launch timing,” Park notes of the OLED race between the Korean rivals LG and Samsung.

    However with the LG OLED tipped to cost around $10,000 the race may not be who launches first, but which TV maker produces a set that affordable to the mass market.

     

    But as prices of rival technology including 60″ LED backlit LCDs are now “extremely competitive” while 70″ and larger sizes will likely be available at “aggressive pricing,” he predicts.

    LCD TVs using oxide TFTs may be available in 4K x 2K format and could also have a big impact on 55″ OLED TVs when they are launched.

    Just as Apple has used high resolution LCD to compete with Samsung’s AMOLED phones, consumers could see contrast ratio and high resolution as offering greater benefits.

    NEC In, Huawei Out: Japan Giant Nabs NBN Deal

    NEC Australia is to supply high-speed broadband services via the NBN by mid-2012.


    Click to enlarge

    The company signed the Wholesale Broadband Agreement with NBN Co today, clearing the path to expand its high-speed wholesale broadband service across Australia.

    Headquarted in Toyko, NEC Australia expects to offer high-speed broadband services via the NBN by mid-2012 to small to medium sized service providers, small ISPs and cloud providers.

    “A lengthy consultation process was taken to ensure that the agreement signed with NBN Co, to ensure we can deliver competitive wholesale broadband services throughout Australia,” said NEC Australia’s managing director, Alan Hyde.

    The negotiated deal offered the best value available, he added, although the value of the deal was not disclosed. 

    The services will include wholesale internet, data and voice services for small ISP, Telco or IT businesses who “may otherwise be edged out of the market by the major providers,” the company said.

    The agreement means NEC will further invest in existing DSLAM-based wholesale broadband and third party networks, which covers 92% of the population.

    This comes after it emerged this week Chinese giant Huawei was denied any contracts on the NBN following Federal government’s fears about a cyber attack by the Chinese administration.

    Read: Huawei Begs NBN Mercy On Cyber War Fears

    Combining its Cloud Telephony and Cloud Contact Centre solutions with fibre services means that NEC Nextep service can provide wholesalers with an end to end solution voice/data service.

     

    NEC Australia provides advice to the government under the Federal Whole of Government Telecommunications Panel on telecommunications services, which agencies procure services to supplement their internal capabilities.

    Mashable IS Cashable: CNN $200m Swoop

    CNN are to buy nerd paradise Mashable for $200m, according to reports.


    Click to enlarge
    Pretty boy Cashmore could be coining a lot more cash in the near future.

    The US social media blog set up by the man, once branded “world’s sexiest geek,” 26-year old Scottish native, Pete Cashmore, from his Aberdeenshire bedroom aged 19.

    Cashmore set up the site as a means to escape his studies and his creation has now offices in New York and is a respected authority on all things tech and social media including Facebook and Twitter.

    A CNN spokesperson refused to respond to the reports but rumour is they offered $200 million for the tech site.

    “We do not engage in speculation about our business and we aren’t commenting on these reports.”

    Industry sources believe a deal could be announced later this week or early next week.

     

    This marks Time Warner owned CNN’s latest bid to become part of the Internet media wave. 

    The deal would also make Cashmore part of the dotcom millionaires club joining the likes of Mark Zuckerberg and Chad Hurley, who set up You Tube, which Google later bought.

    Microsoft’s Steve …The New Jobs?

    Forget Apple: Ballmer wants to be the new tech kingpin.


    Click to enlarge

    In an open letter penned to shareholders, Microsoft boss Steve Ballmer spoke of the “fundamental shift” the Windows maker is undergoing to become a hardcore device maker, like Apple.

    “Last year in this letter I said that over time, the full value of our software will be seen and felt in how people use devices and services at work and in their personal lives,” writes Ballmer.

    “This is a significant shift, both in what we do and how we see ourselves – as a devices and services company. “

    The “shift” which recently saw the software giant launch a Microsoft branded Surface tablet has changed how the Redmond based giant is run, Ballmer admitted, hinting the major personality transplant the giant has undergone, from a dull but dutiful software maker to an innovative creator of hardware, for office and personal use.

    “It impacts how we run the company, how we develop new experiences, and how we take products to market for both consumers and businesses.”

    Ballmer also spoke of the “the roadmap in front of us [that] brings this to life.”

    But despite the move into hardware, Ballmer’s letter is also an olive branch to Microsoft hardware partners on board for new cross platform Windows 8 OS due out this month.

    “We will continue to work with a vast ecosystem of partners to deliver a broad spectrum of Windows PCs, tablets and phones. Our customers want great choices and we believe there is no way one size suits over 1.3 billion Windows users around the world.”

    Microsoft has hooked up with several other hardware names like Asus, Dell, Acer, Nokia and HTC for Windows 8 tablets, PCs and smartphones.

    But still, it looks like Microsoft has plenty more self-branded hardware up its sleeve to come:

     

    “There will be times when we build specific devices for specific purposes, as we have chosen to do with Xbox and the recently announced Microsoft Surface,” he said.

    Microsoft’s boss also alluded to “developing new form factors that have increasingly natural ways to use them including touch, gestures and speech.”

    And the ultimate goal, Windows 8, is envisaged as a cross platform OS for PC, tabs,smartphone, server and cloud to “drive a thriving ecosystem of developers, unify the cross-device user experience, and increase agility when bringing new advancements to market.”

    The Microsoft CEO recently had his wages cut from US$1.38m to $1.32m recent company filing shows.

    “Gen F”: Tweet Freaks, Pin Heads, Instaspammers

    Forget Gen Y: Generation Facebook has hit


    Click to enlarge

    And half of us are addicted to Facebook, Twitter and Co.

    Well if you’re between the ages of 16-25 years, at least. 

    500 Aussie males and females aged 16-25 years quizzed by Boost Mobile, and almost 50% admitted to being addicted to social media.

    But like drugs and alcohol, this addiction can contradict the social objectives it was originally designed for, with Facebookers at risk on placing more value on ‘virtual’ friends than real ones.

    Also, take note, this 50% ‘admitted’ to their addiction, while others may still be in denial. In addition, more females than males (60%) confessed to their ‘addiction.’

    Seven out of ten social media ‘addicts’ confessed to checking their Facebook, Twitter, Pinterest feeds up to a staggering 10 times a day.

    15-19 year olds spend three hours a day on Facebook et al while 20-29 year olds spend slightly less – two hours.

    The Social Network is the most popular type of social media, with 90% of those surveyed actively using their account.

    Over half check soial networks via smartphone. Just 20% of the 500 people surveyed don’t have access to a smartphone – most of the have-nots were from regional areas.

    So, where are they doing it?

    In bed is the most popular place people chose to check their social media feeds, on the toilet and while eating were also front runners

    Here’s the lowdown on the new breed of addicts:

    Generation ‘F’ (Facebook): Constant scanning for notifications and feeds for new activity. It’s not unusual for these people to have 1,000 friends. These crazy F-addicts check their Facebook up to 50 times A DAY.

    Instaspammer: Taking photos of literally every meal you eat and object you see. There are already 252,000 users of Instagram in OZ and a new user joins every second globally.

     

    Tweet Freak: Typing every thought that comes to mind, no matter how inappropriate or irrelevant. There are around 1.8 millon Aussie Twitter members.

    Pin Head: Scrapbooking on steroids. Collecting every video and image that catches the eye. 470,000 Aussies are Pin Heads.

     Paul O’Neile, CEO, Boost Mobile, describes the findings as “really incredible” and says it “just shows the reliance youth now have on social media.”

    “These findings show us that some people may have lost all traditional social graces. With the prominence of smart phones they are happy to use their phone anytime and anywhere, just to keep up with what their friends are saying or what pictures have been posted”.

    However, “amidst the worry of addiction, social media has definitely made young Australians more social,” says O’Neile

     Facebook rehab anyone?

    It’s Here: Samsung Store Hits Melbourne

    Hello Galaxy: Samsung opens second store in Oz in Melbourne
    As tipped by Channel News, Samsung opened a new Experience Store in Melbourne at the Highpoint Shopping Centre in the western suburbs, yesterday.

    Melbournians can now immerse themselves in the Samsung experience and play with its Galaxy Android phones, Tabs and Smart TVs and even get a peek at new 8″ Galaxy Note.

    The Samsung Experience Store, located next to David Jones, will be joining Dick Smith, JB HiFi, All Phones and Telstra, all of whom have stores at Highpoint.

    Samsung opened its first Experience Store store in Sydney’s George St last year just down the street from the Apple Store, and like its Sydney store, will sell everything from its Galaxy S III smartphones to Tabs, wireless audio with docks, notebooks and Smart TVs at its only Melbourne store.

    “The new Highpoint Shopping Centre in Melbourne seemed an appropriate home for our second Samsung Experience Centre in Australia with its premium design and impressive range of retail stores,” said Tyler McGee, Vice President of Telecommunications, Samsung.

    “Building on the successes of our Sydney store, the Samsung Melbourne Experience Store gives consumers an opportunity to discover more about our wide range of innovative and connected products from our expertly trained staff.”

    The giant also confirmed it will be previewing the new (and yet unseen) Galaxy Note 8 tablet in the Melbourne store, ahead of its release in April, and will also be on show in its Sydney outlet.

    The Galaxy Note 8.0 “aims to re-ignite the mid-size tablet category, providing exceptional multimedia performance with a compact 8-inch screen”, and uses S Pen technology which you can like a a traditional pen and paper.

     

    To celebrate the Melbourne  opening, Samsung is offering all customers a mug with a personalised photo of themselves and their friends until 24th March.

    The store will be open from 9am every day with late opening Thursday and Friday nights.

    Check out Samsung’s Melbourne’s Samsung Experience Store at Shop 2351 in the Highpoint Shopping Centre

    Optus Up 4G Ante V Telstra

    Look out Telstra: Optus to have the biggest 4G network after Vividwireless Group acquisition.


    Click to enlarge

    Optus has completed its acquisition of Vividwireless from the Seven Group, giving it access to spectrum previously held by the communications company.

    The telco also announced to invest in two major 4G LTE-TDD testing facilities in St Marys in Western Sydney and at Macquarie Park In preparation for a “major national LTE-TDD network rollout in 2013.”

     This will give it the “the highest capacity 4G network in Australia,” the telco says, outrunning rival Telstra.

    Long-Term Evolution Time-Division Duplex (LTE-TDD) is an advanced version of TD-LTE technology as used by NBN wireless services, and is already used by 4G operators in China.

    Telstra, who beat Optus to the post last year to launch the first 4G LTE network in Oz, already has 100,000 customers on its ultra fast mobile broadband service.

    Optus claims its 4G LTE service is “significantly faster than existing 4G networks.”

    Telstra’s typical download speeds are 2Mbps – 40Mbps, uploads of 1Mbps – 10Mbps, while Optus reckons its 4G network has typical download speeds from 25Mbps to 87Mbps.

    Optus has now gained access to up to 98MHz of spectrum in the 2.3GHz band across key population areas, after receiving ACCC and FIRB approval for the Vividwireless acquisition and was advised by ACMA of its willingness to reissue key spectrum licences, previously held by that company.

    Optus released first 4G service to NSW areas of and the Hunter region in April and will now expand the service to Sydney, Melbourne and Perth by middle of the year, it confirmed. Telstra has already rolled out its 4G network to all capital cities and many regional areas.

    “The successful completion of the Vividwireless deal reinforces our commitment to being a leader in 4G and in providing Australians with a range of high speed mobile services,” Kevin Russell, CEO, Optus Consumer.

    The Minister for Communications, Senator Stephen Conroy, welcomed today’s 4G investment by Optus and even managed to get a plug for the NBN, saying:

     

    “The Optus announcement complements the Gillard Government’s investment in the National Broadband Network.

    “Mobile operators know that high-speed fixed-line broadband infrastructure is critical to meeting future demand for wireless data.

    “Smartphones, tablets and other portable devices are an important part of how Australians get online and involve themselves in the digital economy.”

    High speed mobile broadband on 4G is set to explode in Oz with 7 million devices in use by 2016, local analysts Telsyte predict.

    What’s ‘The Future of Computing’?

    It’ll be all about storage and power usage, says HP Labs CTOMartin Fink, CTO and Director HP Labs, has laid out the future of computing. 

    Speaking at the NTh Symposium in California last week, HP Labs CTO predicts data and power usage will be the big issues of the future in IT,  according to US reports. 
    Computers have not changed much since the 1950’s, the only difference is everything is now virtualised, he says. 
    But new technologies in storage, power consumption are about to change computer architecture as we know it.  
    HP Project Moonshot

    “So for 60-plus years, we have been doing computing the very same way. We have the CPU. It does the basic math. We have some main memory. And we have some sort of IO, which is typically storage, and eventually became a lot of networking. 

    “And when we virtualize it, we’ve basically recreated the exact same thing in virtual form.”
    HP Labs is the PC giant’s innovation hub, which anticipates future IT trends. Seeing as HP missed the mobile revolution, it has now gone hard into R&D and enterprise solutions. This is set to be driven further by CEO Meg Whitman. 
    With the onslaught of ‘big data’ at enterprise level, its not even about petabyes anymore, Fink says his team started thinking “thinking at the exabyte range” when trying to solve future data needs. (An EB is equivalent to 1 billion gigabytes0.
    He also predicted power usage by IT, computers will be a major issue of the future, with cloud data expanding possibilities. 
    “If we actually took the cloud and called it a country, on a power consumption basis, the cloud would be the fifth-largest country in the world. … And, we are barely scratching the surface of the amount of data that’s going to come at us.”
    Fink also referred to technologies including HP’s Project Moonshot server which runs off mobile technology, saving rakes of power. The Hp.com website is now powered on the equivalent power of 12 60-watt bulbs, he said. 
    Fink also branded copper cables as ‘energy-sucking devil’ and reckon “we will use 16,000 times less energy per bit to process [data] by moving from pure copper-based systems to photonics-enabled systems.”  
    IT energy consumption is an issue we need to look “holistically” he warns, and avoid placing blame on someone else. 
    “Why don’t we start thinking about the problem in terms of how we stop using energy in the first place.” 
    HP Labs CTO also spoke of how the industry is breaking away from conventional memory solutions, to new technologies such as PCRAM and memristor, as a replacement for Flash, SSD, DRAM and SRAM. 
     

    Development of memristor is currently under development by teams including Hewlett-Packard, SK Hynix and HRL Laboratories.

    In October 2011, HP Labs announced the commercial availability of memristor technology within 18 months, but remains to be seen. 
    “The power requirement for memristor is almost nothing, yet it will scale to a couple petabytes of capacity in a few years,” he said. 
    “We can achieve levels of scale that are much more significant than we can reach with flash or DRAM.”