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 29 November 2018

Looking back at Readdle’s journey from zero to hero

Readdle launched its first app on the App Store ten years ago and recently celebrated 100 million downloads. Readdle’s Denys Zhadanov came to TechCrunch Disrupt to look back at the past ten years.

“I think it's about timing. Back in 2007 when the iPhone was launched for the first time, there was no app or no App Store,” Zhadanov said. “And then we got a call from Apple that said: ‘Hey guys, we're launching the App Store.’”

One of the reasons why Readdle ended up on Apple’s radar is that they started working on a solution to read books and documents even before the App Store. It was a web app and it was already listed on Apple’s website.

This web app alone attracted 60,000 users — again, that was before the App Store and with a small iPhone install base.

Today, Readdle has eight productivity apps. If you have an iPhone, chances are you’re using some of them, such as Scanner Pro, Documents, PDF Expert and Spark.

And it says a lot about Readdle’s skills. When you’re building productivity apps, you’re competing with built-in apps. There’s already a calendar app and an email app on your iPhone when you first set it up.

“The way we look at this, if our work can inspire one of the biggest companies to move into this area, we're doing something right,” Zhadanov said. “But we have to be very fast and move and run faster because there is no way you can compete with giants like Apple, Google and Microsoft.”

What’s next for Readdle now? The company has received acquisition offers in the past. “We've had offers from different partners but we never discuss and disclose publicly either these talks or our revenues because we're still private,” Zhadanov said.

But it doesn’t mean that Readdle is standing still. When Readdle released Spark four years ago, it was a free app from day one. Spark now has 500,000 daily active users.

“Now we're at this stage where we are trying to accomplish a much bigger challenge than ever before, which is reinventing email,” Zhadanov said.

You can now use Spark to share inboxes with your team. It lets you comment on an email thread, assign emails to team members and more. If you want to unlock all the collaborative features, you need to pay a premium subscription.

It’s still the very beginning of the team product. “I think we have thousands of teams but only tens or hundreds are paying,” Zhadanov said.

Eventually, Readdle could end up raising money to iterate faster — maybe, maybe not. “I'm not saying we need [to raise money ]. I'm saying we might raise money next year to scale faster,” Zhadanov said.

Being a bootstrapped company has some great advantages for now. Readdle doesn’t feel any pressure from investors saying that they need to launch something now. The company can spend more time refining products.

Finally, TechCrunch’s Ingrid Lunden asked about the political climate in Ukraine. A few days ago, a presidential decree introduced martial law in some parts of Ukraine due to tensions with Russia.

“We're trying not to comment on political issues as well. But, right now, we're not affected as a company, as a business,” Zhadanov said. "I think the perception from outside might be affected.”

According to him, Readdle has already thought about “plan B and plan C” in case it gets worse.



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

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support