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

Tuesday, 25 February 2020

On-demand tutoring app Snapask gets $35 million to expand in Southeast Asia

Snapask, an on-demand tutoring app, announced today that it has raised $35 million in Series B funding. Earmarked for the startup’s expansion in Southeast Asia, the round was led by Asia Partners and Intervest.

Launched in Hong Kong five years ago, Snapask has now raised a total of $50 million and operates in Hong Kong, Taiwan, Malaysia, Indonesia, Thailand, Japan and South Korea. Its other investors have included Kejora Ventures, Ondine Capital and SOSV Chinaccelerator (Snapask participated in its accelerator program).

Founder and CEO Timothy Yu said Snapask will expand into Vietnam and focus on markets in Southeast Asia where there is a high demand for tutoring and other private education services. It will also open a regional headquarter in Singapore and develop video content and analytics products for its platform.

The company now has a total of 3 million students, with 1.3 million who registered over the past twelve months (including a recent surge that Yu attributes to students studying at home after COVID-19 related school cancellations). Over the past year, 100,000 tutors have applied, taking Snapask’s current total to 350,000 applicants.

Yu says that over 2 million questions are asked by students each month on the platform, with each subscriber typically asking about 60 questions a month, during tutoring sessions that last between 15 to 20 minutes. The majority, or about two-thirds, of the questions are about math and science-related topics.

One thing all of Snapask’s markets have in common are highly-competitive public exams to enter top universities, says Yu. The exams have both a positive and negative effect on education, he adds.

“Students have a very clear objective about what topics they need to study, so that is driving a very lucrative market in the tutoring industry. But I think what Snapask focuses on is that exams are important, but you should do it the right way. We’re about self-directed learning. It’s not necessary to go to three-hour classes every day after school. If you need specific help on a question, you can ask for it immediately.”

While at university, Yu worked as a math tutor, and sometimes spent a total of two hours commuting to sessions that lasted the same amount of time. In markets like Malaysia or Indonesia, many educators chose to work in major cities, leaving students in rural areas with less options. The goal of Snapask is to help solve those issues and connect tutors with more students.

Yu says the average time for students to connect with a tutor after asking a question is about 15 to 20 minutes, which it is able to do because of machine learning-based technology that matches them based on educational styles, subject and availability. Snapask’s matching algorithms are also based on how students engage with tutors (for example, if they respond better to concise or longer, more elaborate answers). Students can also pick up to 15 to 20 tutors for their favorites list, who are prioritized when matching.

Yu says Snapask screens tutors by looking at their university transcripts and public exam results. Then they go through a probation period on the platform to assess how they interact with students. The platform also tracks how many messages are sent during a tutoring session and response times to make sure that tutors are explaining students’ questions instead of just giving them the answers.

Tutors can talk to up to 10 students at a time through Snapask’s platform. Yu says Snapask tutors in Hong Kong, Singapore, Japan and South Korea who spend about two hours per day answering questions usually make about $1,200 a month, while those who work about four to five hours a day can make about $4,000 to $5,000 a month. The company uses different pricing models in Southeast Asian markets, and Yu says tutors there can make about 50% to 60% more than they would at traditional tutoring jobs.

Other study apps focused on students some of the same markets as Snapask include ManyTutors and Mathpresso, whose products combine tutoring services with tools that let students upload math questions, which are then scanned with optical character recognition to provide instant answers. Yu says Snapask is focusing on one-on-one tutoring because it wants to differentiate by creating a “holistic experience.”

“A lot of students come to Snapask after using OCR tools, which we know that user surveys, but they can’t get to certain steps. They still need someone to help them understand what is happening,” he says. “So we try not to use technology for every component in teaching, but to make it more efficient and scalable, and we’re creating a holistic experience to differentiate us.”



from TechCrunch https://ift.tt/32qmLTw
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support