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

Friday, 30 November 2018

Language learning app Babbel sold 1M US subscriptions this year, moves into language travel

In the world of online language learning, there are basically two heavyweights: Duolingo and Babbel. Duolingo is betting on a freemium model and a strong focus on using algorithms to help you learn better, while Berlin-based Babbel is a paid service that employs hundreds of teachers. As Babbel co-founder and CEO Markus Witte announced at TechCrunch Disrupt Berlin today, his company is now moving into a new area of language learning with the launch of a language travel marketplace. The company also today announced that it now has over 1 million paying users in the United States.

This new service, which is scheduled to go live next year, is the result of the previously undisclosed acquisition of a Lingo Ventura, a Berlin-based startup that partners with international language schools and local providers to offer a language travel booking platform. As Witte told me ahead of today’s announcement, Lingo Ventura already had connections with 200 language schools in 30 countries. The company never quite managed to make a dent in this market, which has traditionally been quite fragmented.

Witte believes that Babbel, thanks to its existing user base, will be able to turn this into a profitable business, though. “There is a lot of potential here because the current market is not very transparent,” Witte told me. “In Europe, our brand is so well-known now that we are the first stop for learning languages.” And that brand awareness will surely help drive interest in this new platform. The person who uses the company’s app has, after all, already shown interest in learning languages and a willingness to pay for that.

While language travel is quite popular in Europe, it remains a bit of a foreign concept in the United States and few people specifically travel abroad to learn a language. This isn’t a small market, though. In Germany alone, market revenue was about €220 million in 2017, and the various companies that play in this space booked about 150,000 travel bookings last year.

Unsurprisingly, Babbel will first focus its marketing efforts for its yet-to-be-named travel marketplace (I think Babbel Travel is a safe bet) on Europe. The platform, however, is global, and Babbel isn’t going to stop anybody from booking through its platform, of course.

As far as the U.S. language travel market is concerned, though, Babbel expects that it’ll be able to pull in some customers there, too. “It’s not zero,” the company’s U.S. CEO Julie Hansen told me when I asked her about that market. “I think in due course, we’ll discover if there’s a place for us. In a way, you can serve a market better that is so fragmented and ill-defined.” North America in general has generated quite a bit of growth for Babbel recently, especially since it appointed Hansen as a CEO there, though it remains to be seen if travel will become a major revenue source for the company there.

No matter in which geography it will operate, though, Babbel will work with partners, and not run its own programs. “That was a strategic decision on our part,” said Witte. “We want to work with partners, and if we make acquisitions, those are almost always about building bridges to our partners.”



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

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support