Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Thursday, 31 October 2019

Ember’s Mug 2 and Travel Mug 2 extend your coffee temperature sweet spot

One of the world’s most static technologies may be the humble mug, but startup Ember decided it was time for a change when they introduced their temperature-controlled smart mug to the market in 2016. Now, the company has launched its Ember Mug 2 – a follow-up that keeps the concept and design intact, but that improves the lineup in some key ways.

There are two separate new second-generation Ember mugs – the Ember Travel Mug, and the Ember Mug designed for home and office use. Both add extended battery life, thanks to swapping its old battery technology with “the most advanced battery technology on the market,” and both gain new redesigned charging coasters, while the Travel Mug 2 gets a new control interface for adjusting the temperature of the beverage within, and it’s a bit lighter while holding the same volume.

Ember Mug 2 (from $99.95)

Ember Mug and Travel Mug 2 3This sequel to Ember’s home mug comes in black, white and copper versions, as well as in two sizes: 10z and 14oz. Like its predecessor, it features an internal heating element and battery, Bluetooth connectivity for smartphone control from the Ember app, and a durable ceramic coating.

The Ember Mug 2 has a customizable LED that shows you when it’s working, and that you can change to whatever color you wish, which is handy if you have a couple of these in use in one household. It comes in black and white (as well as the pricier copper edition) in order to set your desired temperature, you pair it with an app on your phone (a quick and painless process).

Ember will send you notifications when the liquid within reaches the desired temperature. I’ve long used one of their first generation products, and the one thing I found was that on my three-a-day coffee schedule, sometimes my third cup would end up cold, because the battery, while decent, would run out before my appetite for caffeine did.

Enter the sequel, which offers up to 50 percent better battery life than the original version. It’s hard to quantify, since the speed with which I drink my coffee differs day to day, but I will say that in testing I haven’t seen the low battery warning before I was long done actually drinking coffee for the day. In short, if you make sure to pop the mug back on its charging coaster every evening, you should have plenty of juice for a full day of use the next day without any sense of mug range anxiety.

Ember Travel Mug 2 ($179.95)

Ember Mug and Travel Mug 2 5The Travel Mug 2 gets a slight redesign as well as battery improvements. Whereas Ember used a physical dial to control temperature adjustments without requiring you to use your phone on the last generation, now there’s a touch sensitive area on the cup just above where the body expands out towards the top. You can slide your fingers around this to increase or decrease the temperature of whatever you have within.

This tweak is likely what allowed Ember to slim down the design while keeping the internal volume (12 oz) the same, so that it’s a bit more lightweight and travel friendly than before (while also offering as much as three hours of battery life). Ember also took the auto sleep and wake features that it introduced with the original Ember ceramic Mug and brought them to the Travel Mug 2, meaning that it’ll turn itself on and off automatically depending on whether it detects liquid inside. or motion from being picked up, to extend battery life even further.

Ember Mug and Travel Mug 2 7The design of the Ember Travel Mug 2 is top-notch, with a smooth matte surface and hand-friendly design, along with clear, easy to red LED displays that just disappear when not in use. The bottom display shows current temperature, as well as an indicator of remaining battery life, and you can add a custom name to show for avoiding confusion if there are multiple Travel Mugs in use.

Bottom Line

Ember’s follow-up hardware to its initial lineup isn’t a dramatic change – but the collection didn’t need a major overhaul because it gets so many things right. The added battery life in the new generation is great, and the appeal remains the same: If you’re a coffee or tea fanatic and don’t love returning to a lukewarm or cold cup, then this is the stuff for you.

Could you opt for a vacuum-walled mug or travel tumbler? Absolutely, and the Zojirushi line-up of insulated travel mugs will keep liquids hot for days. But Ember’s home mug is without peer for actually keeping things hot in an open-top design, and the Travel Mug’s ability to actually adjust and increase temperature on the fly is also a unique value proposition that can’t be matched by any passive insulation.



from TechCrunch https://ift.tt/326cDNT
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support