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; } } Mendelson Tiu, Author at Smart Office - Page 62 of 72

    Smart Office

    Epson To Roll Out Interactive Projector

    Epson is set to launch a new ultra short throw projector that can turn any surface into a communication tablet. The Epson 450Wi is aimed at classrooms and will provide interactive capabilities to students.

    According to Epson, this projector integrates interactive functionality in one machine without the constraints or expense of an interactive whiteboard. The 450Wi can project images up to 96-inch in native WXGA, uses an ultra-short throw projector design that claims to eliminate many of the common problems of interactive systems such as an intrusive classroom footprint as well as eye glare, and has a new mount designed for simple wall installations.

    “Anchored close to the wall, you can project extra-large, 80″ images from just 2′ away,” says the company.

    In addition, the projector works on almost any surface “an existing whiteboard, a flat wall, even a chalkboard with dry-erase paint. Interactive capabilities are built into the projector and not into a board, so virtually any surface will work”. 

    Finally, its interactive pen works like a mouse on your PC/Mac. “It is software agnostic and Web 2.0 friendly. Similar to a computer monitor, the open architecture allows users to use, share, and engage with virtually any software, digital media file or e-textbook,” concluded the company.

    Kensington Goes For Netbook Market

    Kensington has launched a new range of accessories for netbooks in an effort to strengthen and expand its portfolio. The new line includes a compact mouse, a security lock, and a reversible case.


    Click to enlarge
    According to Kensington, the Netbook mice are fit to scale for the 30 – 90 minute netbook usage model and are available in two variations – wired ($19.95) or wireless ($39.95).

    The Kensington Netbook security lock has been modified for netbooks to keep your computer safer than ever. The compressed coil lock is only 78mm long but expands to 1.8m so you can lock your netbook down and keep it safe from straying hands. This security lock has an RRP of $29.95.

    Finally, the Kensington Netbook case is reversible and is cushioned to shield your computer from damage whilst on the move. It is available for $19.95.

     

     


    Click to enlarge
    In addition to the new Netbook range, Kensington also has a couple of ‘smart made simple’ products to enhance productivity. The full portfolio is comprised of seven categories:

    Control It: A high performance range of mice, presenters, trackballs, keyboards and keypads, which make computers easier to control. Highlights from the range include the SlimBlade Trackball laser mouse which has an RRP of $39.95.

    Power It: Rechargeable battery packs power iPods, MP3 players and other mobile devices on the move, without the need for a power source.

    Carry It:  Kensington’s Contour range of notebook cases reduces shoulder and back fatigue by up to 35 percent.

    Play It: A range of accessories which allow consumers to enjoy and use iPods, iPhones, MP3 players or mobile phones in the car, home or out and about for hours on end without running out of power.

    Secure It: Kensington offers a comprehensive range of mobile and desktop locks, which make it easy to keep your computer safe and secure, wherever you are.

    Connect It: A range of home and office computing solutions, with one-touch simplicity, including multi-view monitor adaptors, notebook stands and a variety of connectivity devices.

    Optimise It: Based on US army research into body measurements, this ergonomic range protects against poor posture, eyestrain and repetitive strain conditions.

    See: au.kensington.com

    LG To Release Android Tablet This Year

    In addition to the Optimus, LG has confirmed that it will launch two more Google Android phones as well as a thin and light Android tablet in the next coming months.According to the company, the new Optimus Series will be comprised of devices running on the popular Android operating system. The various smartphones and tablet devices will range from entry to premium level with various form factors to meet the diverse needs of all customers.

    The two android-powered smartphones in the pipeline for the Australian market – LG Optimus One with Google and LG Optimus Chic – will run on Android Platform 2.2 (Froyo).
     
    LG said that the Optimus One with Google offers the latest in Google mobile features and connects seamlessly to the world according to Google. “Its convenient user interface and diverse multimedia options ensure a mobile environment that makes this device one of the easiest to use on the market,” said the company.
     
    The LG Optimus Chic is aimed at fashion aficionados with its ‘tasteful design’ incorporating soft and smooth lines.
     
    Finally, LG will be introducing its first tablet device later this year. Running on the Android Platform, LG claims that the tablet will deliver ‘vastly superior performance while still managing to be thinner and lighter than competing devices.’

    First Review: Light Toshiba Notebook For Business Travellers

    Toshiba has just launched an ultra-portable notebook designed for the mobile professional. The A600 is a dead ringer for the company’s R500, but is equipped with the latest software and services to simplify your computing experience.


    Click to enlarge
    The build and design is similar to Toshiba’s Portege R500, making the A600 a lightweight but tough notebook. It weighs from 1.46kg and is only 30mm thick, which is good for business travellers looking for a portable notebook that can last for hours on end.

    The unit hosts the volume wheel, headphone and microphone jack, USB port, e-SATA/USB combo port, D-Sub out, and AC port on the left side, while a DVD drive, ExpressCard slot, Wireless on/off switch, SD card reader, USB, and Ethernet port are found on the opposite side.

    Opening the lid reveals the trackpad with a fingerprint reader in between the mouse buttons, system indicators (DC-in, Power, Battery, HDD, SD/SDHC card, Wireless), built-in microphone, keyboard, Display and Toshiba Assist button on the upper right hand side of the unit, and a web camera sitting on top of the screen.

     


    Click to enlarge
    The A600 uses Intel’s Core 2 Duo U9400 processor running at 1.4Ghz, has two gigabytes of RAM, a 250GB hard drive, and runs on Windows Vista Business (SP1). It also comes with a suite of Toshiba’s ‘support’ programs that will help users maintain and troubleshoot their computer.

    Various programs are pre-installed on the device which includes Adobe Acrobat 9, Windows Live OneCare, Google Desktop, Google Earth, Microsoft Office, Microsoft SQL Server 2005, Picasa2, Recovery Disc Creator, Truesuite Access Manager (for Fingerprint), Toshiba DVD Player, and various Toshiba Utilities that simplify computing.

    The Toshiba Utilities include Cooling Performance Diagnostics, HWSetup (to configure your computer), Password Utility, PC Diagnostic Tool, PC Health Monitor, Restart Flash Cards, SD Boot and Format Utility, Security Assist, Face Recognition, Wireless Key Logon, USB Sleep and Charge, and Zooming Utility.

     

    Toshiba also included an HDD Protection software (and accelerator) that parks your HDD head to a safe position whenever it detects vibration or shocks. It is pre-set to level 3 (high) and is so sensitive, even the slightest movement will park the HDD head. It gets annoying at times, especially when you just want to move your notebook to another side of your desk. So the best solution is to probably lower the settings when using the notebook to avoid the annoying ‘HDD has been parked’ pop-up.

    The screen, which had a maximum resolution of 1280×800, was bright, had a wide viewing angle, and was not prone to glare. The speaker located on the upper-left hand side of the unit (near the hinge) can get loud but will not provide you with the best audio quality. It is better for users to connect the

    The A600 lasted for 165 minutes in our DVD test (with volume and brightness set to maximum), and lasted for almost five hours in our productivity test when set to power saving mode.

    Overall, the Toshiba A600 is a portable notebook that can give you the computing power you need to create worksheets and word documents while on the go. The only thing we did not like about this unit is its price tag. It will have an RRP of $2,530 (including GST), which seems a little steep, especially now that we are going through tough economic times.

    See page over for product specifications and final rating.

     

    Toshiba Portege A600 Features:

    Intel Core 2 Duo @1.40Ghz
    2GB RAM
    Windows Vista Business (with Service Pack 1)
    Mobile Intel GMA (Graphics Media Accelerator) Driver 4500MHD
    HDD: 250GB
    Display: 12.1-inch WXGA TFT High Brightness with LED Backlight
    Battery Life: Up to 7.5 hours
    Wireless: Bluetooth, Wireless Lan (802.11a/g/n)
    Webcamera and speaker built-in

    ————————————
    Toshiba Portege A600 | $2,530 |  | www.toshiba.com.au

    For: Solid build; Lightweight profile; Various software and support; Good battery life
    Against: Asking price is a little steep; Not really a powerful unit
    Conclusion: Productivity on the go with Toshiba notebook

    Intel Flash-Based Drives For Servers

    Intel has begun shipping its solid-state drive (SSD) aimed at server, workstation and storage systems.


    Click to enlarge
    Unlike hard drives that contain moving parts, the Intel X-25E Extreme SATA Solid-State Drive features a 50nm single-level cell (SLC) NAND flash memory technology.

    According to Intel, systems equipped with these drives will not suffer from the performance bottlenecks associated with conventional drives, can reduce infrastructure, cooling and energy costs, and untimately ‘lower total cost of ownership for enterprise application by more than five times.’
     
    Intel Server Platforms Group’s General Manager, Kirk Skaugen said, “Hard disk drive performance has not kept pace with Moore’s Law. Intel’s high-performance SSDs unleash the full performance of the latest Intel Xeon processor-based systems while increasing reliability and lowering the total cost of ownership for a broad range of server and storage workloads.”

     

    The Intel X25-E claims to increases server, workstation and storage system performance by 100 times over hard disk drives as measured in Input/Output Per Second (IOPS). A storage model which includes SSDs can also lower energy costs by up to five times, an added benefit for businesses focused on electricity savings.
     
    The product was designed for intense computing workloads which benefit primarily from high random read and write performance, as measured in IOPS. Key technical performance specifications of the 32 GB Intel X-25E SATA SSD include 35,000 IOPS (4KB Random Read), 3,300 IOPS (4KB Random Write) and 75 microsecond read latency. This performance, combined with low active power of 2.4 watts, delivers up to 14,000 IOPS per watt for optimal performance/power output.

    The product also achieves up to 250 megabytes per second (MB/s) sequential read speeds and up to 170 MB/s sequential write speeds, all in a compact 2.5-inch form factor.
     
    Pricing and Availability

    The 32GB capacity drive is in production and priced at US$695 for quantities up to 1,000. The 64GB version is expected to sample in the fourth quarter with production estimated for the first quarter of 2009.

    See: www.intel.com/go/ssd

    Ericsson Router Shares Mobile Broadband

    Forget about USB dongles for your wireless broadband, the Ericsson W35 allows you to connect multiple devices via Ethernet and/or Wi-Fi simultaneously, share a printer or storage device, make calls, and even receive fax.


    Click to enlarge
    This mobile broadband router is perfect for users who are always on the go, renters, or for households that lack fixed line infrastructure. The Ericsson W35 provides voice, fax and high speed internet using the mobile phone networks and utilises the 2G/3G mobile network.

    The W35 is easy to set up: all a user needs to do is to put a SIM card into the slot located on the left side of the router,  connect it to a PC (via Ethernet) for the initial configuration, and/or hook up a telephone to receive and make calls. Typing in mbr or 192.168.1.1 on Internet Explorer will take you to the main interface. From there you can see an overview of the system, view traffic statistics, turn the Wireless LAN on/off, share storage device and printers, and view event logs.

    As soon as that is done, users can connect devices via Ethernet (up to four) and/or Wi-Fi, call anyone using the phone connected, and share storage devices and printers.

     


    Click to enlarge
    Up front, users can find six indicators: signal quality, voice mail, computer (which means that it is impossible to establish a connection to the mobile network), wireless LAN, globe (lights up if an Internet connection is established), and telephone (lights up when a connected telephone is off-hook). The standby button at the bottom of the front shows a steady blue when the W35 has finished the start-up procedure.

    Although not as fast as the recently launched Telstra Wireless Broadband Router, the Ericsson W35 still provides decent broadband speeds. During our test, the W35 produced download speeds of up to 4.3Mb/s and upload speeds of up to 1.13 Mb/s (using speedtest.net and connecting to the Sydney server).

    The W35 is available now for $517, with accessories such as a battery pack ($67.32) and antenna cables ($16.50) sold separately. See the Powertec website (www.powertec.com.au) for more information on the product.

    LG Bags Three Gfk Awards

    LG was awarded the GfK No.1 Award in three categories (Home Theatre Systems, DVD Players, and Microwave Ovens) by leading market researcher GfK Retail and Technology.

    The award is based on units sold for the 12 month period from January – December 2008 and is only given to brands in general distribution.

    Stan Bilinski, Senior Category Marketing Manager, LG Electronics said, “To be awarded No 1 in three separate categories by GfK is a great achievement for LG and we are pleased to receive such highly acclaimed recognition in both the Audio Visual and Cooking categories”.

    “2009 is set to be a big year for LG especially for Audio Visual and Cooking appliances. We are due to launch new products throughout the year in both categories that will continue to show LG’s commitment to leadership and innovation” he added.

    See: www.lge.com.au

    Smaller Computers On The Way Says Intel

    Intel claims that it has made advances in its chipset technologies that users will soon be able to have smaller and smarter computers.


    Click to enlarge
    According to Intel, future Intel Atom, Core and Xeon processors and System on Chip (SoC) products will make computers smaller, smarter, more capable and easier to use. For example, among a number of other innovations on tap, Intel will integrate graphics into some of its future chip products for the first time ever.

    Intel Architecture Group’s Executive Vice President and General Manager, Sean Maloney said, “Over the past 40 years, the opportunities enabled by Moore’s Law have gone beyond just impressive performance increases. The rapidly increasing number of transistors and processor instructions we add have made possible the integration of more and more capabilities and features within our processors. This has driven an incredible amount of innovation throughout the industry, with the real winners being the consumers, gamers and businesses which buy these Intel-based computers.”

    In his Intel Developer Forum keynote, Maloney demonstrated a Westmere-based PC that showed a marked increase in responsiveness on simple, everyday tasks such as Web-surfing with multiple windows open.

    Moreover, Westmere is Intel’s first 32nm processor, and is the first-ever Intel processor to integrate graphics die right into the processor’s package. As well as supporting Intel Turbo Boost technology and Intel Hyper-Threading Technology, Westmere adds new Advanced Encryption Standard (AES) instructions for faster encryption and decryption. Westmere is on track with wafers already moving through factory floors for planned fourth-quarter revenue production.

     

    After Westmere, Intel’s chip integration will continue with 32nm processors codenamed “Sandy Bridge.” Sandy Bridge features Intel’s sixth-generation graphics cores on the same die or silicon real estate as the processor core, and will include acceleration for floating point, video and processor intensive software most often found in media applications. Maloney showed a Sandy Bridge-based system running a range of video and 3-D software to demonstrate the health of a far-future product line at its early stage.

    Maloney demonstrated early silicon based on the “Larrabee” architecture, the codename for a family of future graphics-centric co-processors. He also confirmed that key developers have received development systems.

    With the first product due next year, Larrabee takes the programmability of Intel Architecture and dramatically extends its parallel processing capabilities. This flexible programmability and the ability to take advantage of available developers, software and design tools give programmers the freedom to realise the benefits of fully programmable rendering and thus easily implement a variety of 3-D graphics pipelines such as rasterisation, volumetric rendering or ray tracing.

    Combined, PC users will experience stunning visual experiences on Intel-based PCs that incorporate this product. Maloney went on to demonstrate a real-time ray-traced version of the popular game “Quake Wars: Enemy Territory” running on Larrabee and Intel’s next-generation enthusiast gaming processor, codenamed “Gulftown,” which will carry the Core brand. While Larrabee silicon will initially appear in discrete graphics cards, the Larrabee architecture will eventually be integrated into the processor along with other technologies.

     

    Maloney also provided attendees with a preview of Intel’s next-generation intelligent server processor, codenamed Westmere-EP, and Intel’s commitment to the high-end of the server market with its Xeon and Itanium processor families. Maloney discussed the unprecedented generational improvement that the forthcoming “Nehalem-EX” server processor will deliver, with performance improvements even greater than what the current Intel Xeon 5500 Series provided versus Intel’s previous chip generation.

    Maloney described the convergence of compute, networking and storage in the data centre, sharing the company’s vision of a converged data centre IO fabric led by Intel 10GbE solutions. Intel also has a number of joint efforts with other industry leaders to deliver optimised platforms, systems, technologies and solutions to address the “hyper-scale” data centre environments of the Internet and cloud services trend.

    Maloney disclosed a new ultra-low-voltage Intel Xeon 3000 series processor featuring a TDP (Thermal Design Power) of only 30 watts. To complement the broad range of dense and power-optimised platform offerings, Intel also demonstrated publicly for the first time a single-socket “micro server” reference system which will help enable micro server innovation and future specification.

    Maloney also described the just-disclosed “Jasper Forest” family of embedded processors as an example of extending the company’s popular Nehalem microarchitecture to new markets. Available early next year, Jasper Forest is designed for purpose-built storage, communications, military and aerospace applications, and will offer a new level of integration to save precious board space and power for these dense environments.

    Finally, Maloney announced a new PC management tool using Intel vPro technology. Keyboard Video Mouse (KVM) Remote Control enables IT personnel to investigate issues exactly as the user sees them, resulting in faster diagnosis, fewer desk side visits and added cost savings.

    Inexpensive Media Keyboard From Microsoft

    Microsoft Australia has today announced the Digital Media Keyboard 3000, an entertainment keyboard designed to enhance the computer user’s digital lifestyle at an affordable price.


    Click to enlarge
    The Digital Media Keyboard 3000 is the ideal keyboard for the modern day media centre user, making it easier than ever to access movies, music and photos on your PC. This keyboard provides one-touch access to Media Center controls such as play, pause and volume – so watching your favourite movies is easy. This keyboard also provides access to My Favourites Keys and customisable Hot Keys.

    This keyboard is optimised for Windows Vista, with quick access to the Flip 3D feature – which allows consumers to flip through all their open windows and quickly switch between applications. The speed and flexibility of the Digital Media Keyboard 3000 lets users easily customise their computing experience.

    The My Favourites Keys deliver one-touch access to the computer user’s most-used websites, files and folders. Simply push and hold a key to assign it to the current destination – just as the user would preset a car stereo. The customisable Hot Keys enable users to quickly launch into their favourite programs such as Messenger, Mail, Web/Home and Media Player.

     

    Key features of the Digital Media Keyboard 3000 include:

    • Media Center controls – people can access popular media activities with one touch, such as play, pause and volume.
    • With one click, the Windows Start Button pulls up the Windows Start menu enabling people to swiftly search for or launch documents. If users have Windows Vista installed, they can search their PC or the Web directly from the Windows Vista Start menu.
    • Zoom allows consumers to easily zoom in to and out of digital pictures, maps and more. 
    • Enhanced F Keys make it easy to complete common tasks with one touch. Keys are conveniently grouped according to common usage patterns, such as New, Open and Close. Users can also set traditional F Key functions with the F Key lock.
    • Spill-resistant keys – Don’t worry if you spill some of your drink as the integrated water channels in the keyboard are designed to drain liquid away.

    Pricing and Availability

    The Microsoft Digital Media Keyboard 3000 will be available in July 2008 for a recommended retail price of $49.95.