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, 3 September 2020

Digital gardens let you cultivate your own little bit of the internet

Sara Garner had a nagging feeling something wasn’t quite right.

A software engineer, she was revamping her personal site, but it just didn’t feel like her. Sure, it had the requisite links to her social media and her professional work, but it didn’t really reflect her personality. So she created a page focused on museums, which she is obsessed with. It’s still under construction, but she envisions a page that includes thoughts on her favorite museums, describes the emotions they evoked, and invites others to share their favorite museums and what they’ve learned.

“I’m going for a feeling of wonderment, a connection across time,” she says.

Welcome to the world of “digital gardens.” These creative reimaginings of blogs have quietly taken nerdier corners of the internet by storm. A growing movement of people are tooling with back-end code to create sites that are more collage-like and artsy, in the vein of Myspace and Tumblr—less predictable and formatted than Facebook and Twitter. Digital gardens explore a wide variety of topics and are frequently adjusted and changed to show growth and learning, particularly among people with niche interests. Through them, people are creating an internet that is less about connections and feedback, and more about quiet spaces they can call their own.

“Everyone does their own weird thing”

The movement might be gaining steam now, but its roots date back to 1998, when Mark Bernstein introduced the idea of the “hypertext garden,” arguing for spaces on the internet that let a person wade into the unknown. “Gardens … lie between farmland and wilderness,” he wrote. “The garden is farmland that delights the senses, designed for delight rather than commodity.” (His digital garden includes a recent review of a Bay Area carbonara dish and reflections on his favorite essays.)

The new wave of digital gardens discuss books and movies, with introspective journal entries; others offer thoughts on philosophy and politics. Some are works of art in themselves, visual masterpieces that invite the viewer to explore; others are simpler and more utilitarian, using Google Docs or WordPress templates to share intensely personal lists. Avid readers in particular have embraced the concept, sharing creative, beautiful digital bookshelves that illustrate their reading journey.

Beneath the umbrella term, however, digital gardens don’t follow rules. They’re not blogs, short for “weblogs,” a term that suggests a time-stamped record of thought. They’re not a social-media platform—connections are made, but often it’s through linking to other digital gardens, or gathering in forums like Reddit and Telegram to nerd out over code.

Tom Critchlow, a consultant who has been cultivating his digital garden for years, spells out the main difference between old-school blogging and digital gardening. “With blogging, you’re talking to a large audience,” he says. “With digital gardening, you’re talking to yourself. You focus on what you want to cultivate over time.”

What they have in common is that they can be edited at any time to reflect evolution and change. The idea is similar to editing a Wikipedia entry, though digital gardens are not meant to be the ultimate word on a topic. As a slower, clunkier way to explore the internet, they revel in not being the definitive source, just a source, says Mike Caulfield, a digital literacy expert at Washington State University.

In fact, the whole point of digital gardens is that they can grow and change, and that various pages on the same topic can coexist. “It’s less about iterative learning and more about public learning,” says Maggie Appleton, a designer. Appleton’s digital garden, for example, includes thoughts on plant-based meat, book reviews, and digressions on Javascript and magical capitalism. It is “an open collection of notes, resources, sketches, and explorations I’m currently cultivating,” its introduction declares. “Some notes are Seedlings, some are budding, and some are fully grown Evergreen[s].”

Appleton, who trained as an anthropologist, says she was drawn to digital gardens because of their depth. “The content is not on Twitter, and it’s never deleted,” she says. “Everyone does their own weird thing. The sky’s the limit.”

That ethos of creativity and individuality was echoed by several people I spoke to. Some suggested that the digital garden was a backlash to the internet we’ve become grudgingly accustomed to, where things go viral, change is looked down upon, and sites are one-dimensional. Facebook and Twitter profiles have neat slots for photos and posts, but enthusiasts of digital gardens reject those fixed design elements. The sense of time and space to explore is key.

Caulfield, who has researched misinformation and disinformation, wrote a blog post in 2015 on the “technopastoral,” in which he described the federated wiki structure promoted by computer programmer Ward Cunningham, who thought the internet should support a “chorus of voices” rather than the few rewarded on social media today.

“The stream has dominated our lives since the mid-2000s,” Caulfield says. But it means people are either posting content or consuming it. And, Caulfield says, the internet as it stands rewards shock value and dumbing things down. “By engaging in digital gardening, you are constantly finding new connections, more depth and nuance,” he says. “What you write about is not a fossilized bit of commentary for a blog post. When you learn more, you add to it. It’s less about shock and rage; it’s more connective.” In an age of doom-scrolling and Zoom fatigue, some digital-garden enthusiasts say the internet they live in is, as Caulfield puts it, “optimistically hopeful.”

While many people are searching for more intimate communities on the internet, not everyone can spin up a digital garden: you need to be able to do at least some rudimentary coding. Making a page from scratch affords more creative freedom than social-media and web-hosting sites that let you drag and drop elements onto your page, but it can be daunting and time-consuming.

Chris Biscardi is trying to get rid of that barrier to entry with a text editor for digital gardens that’s still in its alpha stage. Called Toast, it’s “something you might experience with WordPress,” he says.

Ultimately, whether digital gardens will be an escapist remnant of 2020’s hellscape or wither in the face of easier social media remains to be seen. “I’m interested in seeing how it plays out,” Appleton says. 

“For some people it’s a reaction to social media, and for others it’s a trend,” Critchlow says. “Whether or not it will hit critical mass … that’s to be seen.”



from MIT Technology Review https://ift.tt/3529vYG
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support