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();

Wednesday, 26 February 2020

A look at Made Renovation, which just raised $9 million in seed funding to zero in on bathroom remodels

Made Renovation, a new, San Francisco-based company, thinks it has found a profitable way to help homeowners get done something that busy general contractors in the Bay Area won’t otherwise make time for, which is bathroom remodels.

Why they typically pass on these: they have too many entire homes, or, at least, entire floors, to build for affluent regional homeowners who’ve kept the construction industry buzzing for years.

It’s a problem that founders Roger Dickey, who previously co-founded Gigster, and Sagar Shah, who previously founded Quad, think they can solve through technology, naturally. Their big idea: create bathroom templates that customers can customize but whose scope and costs are generally understood, line up these customers, then hire general contractors who are willing to focus only on these bathrooms.

It’s an idea that’s picking up traction with these GCs, says Dickey, who explains it this way: “General contractors generally see net margin of 3%” no matter the size of the job, owing to unforeseen hurdles, like pipes that suddenly need to be rebuilt, drains that need to be dug and materials that don’t ship on schedule.

In addition to timing issues, GCs are also often dealing with frustrated building owners who might underestimate a project’s costs, particularly in California, where construction bills often cause sticker shock.

Made Renovation sees an opportunity to make both the lives of GCs and homeowners easier. Through pre-negotiated pricing, volume and materials handling (it right now rents part of a warehouse where it receives goods), it’s promising GCs a “reasonable margin” so they can not only pay their crews but live a higher quality of life themselves.

Meanwhile, per the plan, customers need only choose from the company’s “modern” collection, its more traditional “heritage”design or its “artisan” collection — all of which can be customized — then sit back while their long-neglected bathrooms are remade.

Whether Made Renovation can pull off its grand vision is a giant question mark. The construction industry is nothing if not messy, and in addition to convincing GCs of its merits, Made Renovation — like any marketplace company — has to strike the right balance between customer demand and supply as it gets off the ground.

In the meantime, investors clearly think it has promise. Led by Base10 Partners and with participation from Felicis Ventures, Founders Fund and some individual investors, the company has already raised $9 million in seed funding across two tranches.

Part of that capital is on display right now in San Francisco, where Made Renovation today opened its doors to customers who want to check out its design ideas and, if all goes as planned, will begin lining up their own home improvement projects. Customers simply pick a collection, Made Renovation then puts together a “mood board” of materials from that collection, sends out a 3D rendering of what to expect, then goes into build mode with its GC partners.

As for what happens when that build goes awry, Dickey says Made Renovation has it covered. Most notably, while it guarantees the work to its own customers, the GCs with whom it works guarantee their work to Made Renovation.

Dickey also notes that while the startup “may lose money on some projects,” he stresses there are caveats that customers agree to at the outset. Among these, he says, “We can’t X-ray their walls and see if they don’t have wiring up to code. We don’t cover dry rot in walls.” Technology, suggests Dickey, can only do so much.

If you’re in the Bay Area and want to check out its new storefront, it’s on Chestnut Street in SF, in the city’s Marina district. The company hopes to perfect its model in the Bay Area, says Dickey, then expand into other regions. As for why Made Renovation decided to tackle one of the most challenging U.S. markets first, he suggests it’s the best way to test its mettle. “I like the idea of starting a company here, because if we can make it work here, I think we can succeed anywhere.”



from TechCrunch https://ift.tt/2ThwWWu
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support