add_cap( $cap ); } $role = get_role( 'administrator' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } $role = get_role( 'editor' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } $role = get_role( 'author' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } */ function reactpress_enqueue_scripts() { if (is_page('trips')) { wp_dequeue_script('currency-converter'); wp_dequeue_script('swup'); } } add_action('wp_enqueue_scripts', 'reactpress_enqueue_scripts', 20000); function reactpress_head() { global $wp_query; if (is_page('trips')) { ?> 'get_post_meta_for_api', 'schema' => null, ) ); } function get_post_meta_for_api( $obj ) { $postmeta = get_post_meta( $obj['id']); //=============== $apiKey = "0772153bce5238310c5a3fcbe783d1a7"; $cityId = get_field('city_code', $obj['id']); $apiUrl = "https://api.openweathermap.org/data/2.5/weather?id=" . $cityId . "&lang=ru&units=metric&APPID=" . $apiKey; $data = get_transient('weather_data_'.$cityId); if( empty($data) ){ $crequest = curl_init(); curl_setopt($crequest, CURLOPT_HEADER, 0); curl_setopt($crequest, CURLOPT_RETURNTRANSFER, 1); curl_setopt($crequest, CURLOPT_URL, $apiUrl); curl_setopt($crequest, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($crequest, CURLOPT_VERBOSE, 0); curl_setopt($crequest, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($crequest); curl_close($crequest); $data = json_decode($response); set_transient('weather_data_'.$cityId, $data, 3600); // 3600 in seconds = 1h } $postmeta['weather'] = [ 'description' => ucwords($data->weather[0]->description), 'icon' => $data->weather[0]->icon, 'temp' => intval($data->main->temp) ]; //=============== foreach ($postmeta as $key => $field){ if ($key == 'cost_of_living_raw'){ $field = unserialize($field[0]); $postmeta[$key] = $field; } if ($key == 'country'){ $country = get_field_object('country', $obj['id']); $country = $country['choices'][$country['value']]; $postmeta[$key] = $country; } } return $postmeta; } //=================================================================================== //=== aviasales === $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; // add_action('rest_api_init', function () { // register_rest_route( 'aviasales/v1', '/aviasales/', array( // 'methods' => 'GET', // 'callback' => 'aviasales', // )); // }); // function aviasales($request) { // global $travelpayouts_token; // $url = 'https://api.travelpayouts.com/aviasales/v3/prices_for_dates'; // //$request->get_param('cheap') // $params = [ // 'origin' => $request->get_param('departure_city'), // 'destination' => $request->get_param('destination_city'), // 'departure_at' => $request->get_param('departure_date'), // //'trip_class' => $request->get_param('type'), // 'unique' => 'false', // 'sorting' => 'price', // // 'direct' => 'false', // 'currency' => 'usd', // 'limit' => '15', //100 // 'page' => '1', // 'token' => $travelpayouts_token, // ]; // if ($request->get_param('direction') == 'oneway') { // $params['one_way'] = 'true'; // } else { // $params['one_way'] = 'false'; // $params['return_at'] = $request->get_param('return_date'); // } // //$request->get_param('persons') // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($params, true), FILE_APPEND); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // return $result; // } add_action('rest_api_init', function () { register_rest_route('aviasales/v1', '/search/', array( 'methods' => 'GET', 'callback' => 'aviasales_search', )); }); function aviasales_search($request) { $log_file = $_SERVER['DOCUMENT_ROOT'] . '/flight_logs.txt'; $debug_log_file = $_SERVER['DOCUMENT_ROOT'] . '/debug_log_flights.txt'; function log_message($log_file, $message) { $timestamp = date("Y-m-d H:i:s"); file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND); } log_message($log_file, "Starting flight search request."); $marker = '402943'; $host = 'travcave.ru'; $user_ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $locale = 'en'; $trip_class = 'Y'; $signature_token = '6d0c907fad90bb689a5db94d75b3789d'; $segments = [ [ 'origin' => $request->get_param('departure_city'), 'destination' => $request->get_param('destination_city'), 'date' => $request->get_param('departure_date') ] ]; if ($request->get_param('return_date')) { $segments[] = [ 'origin' => $request->get_param('return_city'), 'destination' => $request->get_param('return_destination_city'), 'date' => $request->get_param('return_date') ]; } $params = [ 'host' => $host, 'marker' => $marker, 'user_ip' => $user_ip, 'locale' => $locale, 'trip_class' => $trip_class, 'passengers' => [ 'adults' => (int) $request->get_param('adults'), 'children' => (int) $request->get_param('children'), 'infants' => (int) $request->get_param('infants') ], 'segments' => $segments ]; log_message($debug_log_file, "Received parameters: " . json_encode($params)); $signature_elements = [ $signature_token, $host, $locale, $marker, $params['passengers']['adults'], $params['passengers']['children'], $params['passengers']['infants'], $params['segments'][0]['date'], $params['segments'][0]['destination'], // Reverse order for signature $params['segments'][0]['origin'] // Reverse order for signature ]; if (isset($params['segments'][1])) { $signature_elements = array_merge($signature_elements, [ $params['segments'][1]['date'], $params['segments'][1]['destination'], // Reverse order for signature $params['segments'][1]['origin'] // Reverse order for signature ]); } $signature_elements = array_merge($signature_elements, [ $trip_class, $user_ip ]); $signature_string = implode(':', $signature_elements); $signature = md5($signature_string); $params['signature'] = $signature; $json_params = json_encode($params); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON encode error: $json_error"); return array('error' => 'JSON encode error', 'message' => $json_error); } log_message($log_file, "Request parameters: $json_params"); $url = 'http://api.travelpayouts.com/v1/flight_search'; log_message($log_file, "Request URL: $url"); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_params); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_VERBOSE, true); ob_start(); $result = curl_exec($ch); $curl_error = curl_error($ch); $verbose_log = ob_get_contents(); ob_end_clean(); log_message($log_file, "CURL error (if any): $curl_error"); log_message($log_file, "CURL verbose log: $verbose_log"); log_message($log_file, "API response: $result"); $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); log_message($log_file, "HTTP response code: $response_code"); curl_close($ch); if ($response_code != 200) { log_message($log_file, "API request failed with response code: $response_code"); return array('error' => 'API request failed', 'response_code' => $response_code); } $result = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON decode error: $json_error"); return array('error' => 'JSON decode error', 'message' => $json_error); } if (empty($result)) { log_message($log_file, "Empty result received from API."); return array('error' => 'No results', 'message' => 'No results returned from API.'); } log_message($log_file, "Returning result to client."); return $result; } add_action('rest_api_init', function () { register_rest_route('aviasalescity/v1', '/autocomplete/', array( 'methods' => 'GET', 'callback' => 'aviasales_city_autocomplete', )); }); function aviasales_city_autocomplete($request) { $log_file = $_SERVER['DOCUMENT_ROOT'] . '/flight_logs.txt'; $debug_log_file = $_SERVER['DOCUMENT_ROOT'] . '/debug_log_flights.txt'; // Helper function to log messages function log_message($log_file, $message) { $timestamp = date("Y-m-d H:i:s"); file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND); } log_message($log_file, "Starting city autocomplete request."); log_message($debug_log_file, "Starting city autocomplete request."); $url = 'https://autocomplete.travelpayouts.com/places2'; log_message($log_file, "Request URL: $url"); log_message($debug_log_file, "Request URL: $url"); $params = [ 'locale' => 'ru', 'term' => $request->get_param('city'), ]; log_message($log_file, "Request parameters: " . http_build_query($params)); log_message($debug_log_file, "Request parameters: " . http_build_query($params)); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $curl_error = curl_error($ch); log_message($log_file, "CURL error (if any): $curl_error"); log_message($debug_log_file, "CURL error (if any): $curl_error"); log_message($log_file, "API response: $result"); log_message($debug_log_file, "API response: $result"); $result = json_decode($result, true); curl_close($ch); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON decode error: $json_error"); log_message($debug_log_file, "JSON decode error: $json_error"); return array('error' => 'JSON decode error', 'message' => $json_error); } if (empty($result)) { log_message($log_file, "Empty result received from API."); log_message($debug_log_file, "Empty result received from API."); return array('error' => 'No results', 'message' => 'No results returned from API.'); } $result = array_slice($result, 0, 10); log_message($log_file, "Returning result to client."); log_message($debug_log_file, "Returning result to client."); return $result; } add_action('rest_api_init', function () { register_rest_route( 'aviasalescity/v1', '/aviasalescity/', array( 'methods' => 'GET', 'callback' => 'aviasalescity', )); }); function aviasalescity($request) { $url = 'https://autocomplete.travelpayouts.com/places2'; $params = [ 'locale' => 'ru', //'types[]' => 'airport',//, 'city' 'term' => $request->get_param('city'), ]; $ch = curl_init($url.'?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $result = json_decode($result); $result = array_slice($result, 0, 10); curl_close($ch); //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); return $result; } //=================================================================================== //=== hotels === // add_action('rest_api_init', function () { // register_rest_route( 'hotels/v1', '/hotels/', array( // 'methods' => 'GET', // 'callback' => 'hotels', // )); // }); // function hotels($request) { // //return '1234'; // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($params, true), FILE_APPEND); // $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; // $url = 'https://engine.hotellook.com/api/v2/lookup.json'; // $params = [ // 'query' => $request->get_param('city'), // 'lang' => 'ru', // 'lookFor' => 'city', // 'limit' => 1, // 'token' => $travelpayouts_token, // ]; // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($results->results, true), FILE_APPEND); // if (isset($result->results->locations[0])) { // $id = $result->results->locations[0]->id; // file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', 'id='.$id, FILE_APPEND); // $url = 'https://yasen.hotellook.com/tp/public/widget_location_dump.json'; // $params = [ // 'currency' => 'usd', // 'language' => 'ru', // 'limit' => 100, // 'id' => $id, // 'type' => 'popularity', // 'check_in' => $request->get_param('start_date'), // 'check_out' => $request->get_param('end_date'), // 'token' => $travelpayouts_token, // ]; // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // } else { // $result = false; // } // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // return $result; // } function get_city_id($city, $token) { $url = 'https://engine.hotellook.com/api/v2/lookup.json'; $params = [ 'query' => $city, 'lang' => 'ru', 'lookFor' => 'city', 'limit' => 1, 'token' => $token, ]; $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); if (isset($result['results']['locations'][0]['id'])) { return $result['results']['locations'][0]['id']; } else { return false; } } function start_hotel_search($location, $check_in, $check_out, $adults_count, $token, $customer_ip, $marker, $iata = 'MOW') { $url = 'https://engine.hotellook.com/api/v2/search/start.json'; $params = [ 'cityId' => $location, 'checkIn' => $check_in, 'checkOut' => $check_out, 'adultsCount' => $adults_count, 'customerIP' => $customer_ip, 'currency' => 'USD', 'lang' => 'ru', 'waitForResult' => 0, 'marker' => $marker, 'childrenCount' => 1, 'childAge' => 10, 'iata' => $iata, ]; // Correct signature string construction $signature_string = "$token:$marker:$adults_count:$check_in:$check_out:10:1:$location:USD:$customer_ip:$iata:ru:0"; $params['signature'] = md5($signature_string); // Log all variables for signature file_put_contents('debug_log.txt', "Token: $token\n", FILE_APPEND); file_put_contents('debug_log.txt', "Marker: $marker\n", FILE_APPEND); file_put_contents('debug_log.txt', "Adults Count: $adults_count\n", FILE_APPEND); file_put_contents('debug_log.txt', "Check-in: $check_in\n", FILE_APPEND); file_put_contents('debug_log.txt', "Check-out: $check_out\n", FILE_APPEND); file_put_contents('debug_log.txt', "Child Age 1: 10\n", FILE_APPEND); file_put_contents('debug_log.txt', "Children Count: 1\n", FILE_APPEND); file_put_contents('debug_log.txt', "Currency: USD\n", FILE_APPEND); file_put_contents('debug_log.txt', "Customer IP: $customer_ip\n", FILE_APPEND); file_put_contents('debug_log.txt', "IATA: $iata\n", FILE_APPEND); file_put_contents('debug_log.txt', "Location: $location\n", FILE_APPEND); file_put_contents('debug_log.txt', "Lang: ru\n", FILE_APPEND); file_put_contents('debug_log.txt', "Wait For Result: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature String: $signature_string\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature: " . $params['signature'] . "\n", FILE_APPEND); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $curl_info = curl_getinfo($ch); // Get curl info $curl_error = curl_error($ch); // Get curl error if any curl_close($ch); $result = json_decode($result, true); if (isset($result['searchId'])) { return $result['searchId']; } else { // Log request and response for debugging file_put_contents('debug_log.txt', "Request URL: " . $url . '?' . http_build_query($params) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Response: " . print_r($result, true) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Curl Info: " . print_r($curl_info, true) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Curl Error: " . $curl_error . "\n", FILE_APPEND); return false; } } function get_hotel_search_results($search_id, $token, $marker) { $url = 'https://engine.hotellook.com/api/v2/search/getResult.json'; $params = [ 'searchId' => $search_id, 'limit' => 10, 'offset' => 0, 'sortBy' => 'price', 'sortAsc' => 1, 'roomsCount' => 0, 'marker' => $marker, ]; $signature_string = "$token:$marker:10:0:0:$search_id:1:price"; $params['signature'] = md5($signature_string); // Log all variables for signature file_put_contents('debug_log.txt', "Token: $token\n", FILE_APPEND); file_put_contents('debug_log.txt', "Marker: $marker\n", FILE_APPEND); file_put_contents('debug_log.txt', "Limit: 10\n", FILE_APPEND); file_put_contents('debug_log.txt', "Offset: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Rooms Count: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Search ID: $search_id\n", FILE_APPEND); file_put_contents('debug_log.txt', "Sort Asc: 1\n", FILE_APPEND); file_put_contents('debug_log.txt', "Sort By: price\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature String: $signature_string\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature: " . $params['signature'] . "\n", FILE_APPEND); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); return $result; } add_action('rest_api_init', function () { register_rest_route('hotels/v1', '/hotels/', array( 'methods' => 'GET', 'callback' => 'hotels_search', )); }); function hotels_search($request) { $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; $marker = '402943'; $customer_ip = $_SERVER['REMOTE_ADDR']; // Correct the iata code parameter $city = $request->get_param('city') ?? 'MOW'; $check_in = $request->get_param('start_date'); $check_out = $request->get_param('end_date'); $adults_count = $request->get_param('adults_count') ?? 1; // Default to 1 if not provided // Debugging output for city ID retrieval $city_id = get_city_id($city, $travelpayouts_token); if (!$city_id) { file_put_contents('debug_log.txt', "City ID retrieval failed for city: $city\n", FILE_APPEND); return array('error' => 'City not found', 'debug' => 'City ID retrieval failed'); } // Debugging output for search initiation $search_id = start_hotel_search($city_id, $check_in, $check_out, $adults_count, $travelpayouts_token, $customer_ip, $marker, $city); if (!$search_id) { file_put_contents('debug_log.txt', "Hotel search initiation failed for city_id: $city_id\n", FILE_APPEND); return array('error' => 'Hotel search failed', 'debug' => 'Search initiation failed'); } // Fetch search results $result = get_hotel_search_results($search_id, $travelpayouts_token, $marker); if (isset($result['status']) && $result['status'] == 'ok') { return $result; } else { file_put_contents('debug_log.txt', "Search results retrieval failed for search_id: $search_id\n", FILE_APPEND); return array('error' => 'Hotel search results retrieval failed', 'debug' => 'Search results retrieval failed'); } } Цифровые кочевники (digital nomad) — кто такие диджитал номад и как им стать? | TravCave
ТрэвКейв
Первый в Рунете портал, объединяющий номадов по всему миру 🌎

Мы о путешествиях, о городах, о работе на удаленке. TravCave - это место, где каждый сможет стать блогером и рассказать свою историю.

ГлавнаяСтатьиКто такие цифровые кочевники и как они живут

Кто такие цифровые кочевники и как они живут

1357 0

Провести всю жизнь в одном городе — это губительно для продуктивности. Именно так считают цифровые кочевники (на английском — digital nomads). Для них жизнь — это бесконечное путешествие, дающее силы работать и творить. Как выглядит цифровое кочевничество, в чем его плюсы, как выбрать страну по духу и сложно ли найти единомышленников? Отвечаем на вопросы по порядку.

Кто такой современный цифровой кочевник?

Для цифровых кочевников работа и путешествия — единое целое. Это не дауншифтинг, который был моден в конце нулевых: смысл кочевничества именно в том, чтобы изучать новые страны и параллельно работать. Горы или бирюзовый океан за окном вдохновляют больше, чем серые панельные пятиэтажки. В статистике это называется скучными словами «качество жизни». У номадов оно растет именно в путешествиях.

природа, горы и реки

У каждого цифрового кочевника — своя история. Кто-то всю жизнь мечтал пройти по подвесному мосту в Монтеверде или заняться серфингом в Индонезии. Кого-то угнетает однообразие — в месте прописки будет каждый день одно и то же. Есть кочевники, которым особенно хорошо работается в первые пару месяцев на новом месте. Если это удаленная занятость — разработка сайтов и приложений, маркетинг, дизайн, IT-менеджмент — нужен по большей части только ноутбук и хороший Интернет.

Кочевническая жизнь в подробностях

Digital nomads легки на подъем. После нескольких месяцев на новом месте уже появляются мысли о том, куда двигаться дальше. Иногда план складывается постепенно, иногда идеи приходят спонтанно и переезд укладывается буквально в сутки-двое.

Цифровым кочевникам не обязательно бронировать номер в отеле, у них есть свои совместные пространства — коливинги. Это хабы в разных странах, где можно какое-то время жить и трудиться. Там уже есть рабочие места, надежный интернет, а самое главное — сообщество единомышленников. Самый известный из российских коливингов — «Станция Смена». Из иностранных — Roam, Be Unsettled, Coliving.com, чисто женский хаб Digital Nomad Girls Retreat.

Зачастую коливинг дешевле, чем гостиница или апартаменты. И дружелюбнее: вокруг единомышленники, с которыми можно обменяться впечатлениями и информацией. Можно найти и партнеров по проектам, и неожиданные идеи для продолжения пути: например, «Станция Смена» организует и коллективные горнолыжные вылазки, и серфинг в Португалии без отрыва от работы.

Как выбрать страну, подходящую для digital nomads

Как говорят сами цифровые кочевники, так или иначе маршрут для путешествий строится по пяти основным критериям:

  • финансы — доход кочевника и стоимость жизни в конкретной стране;
  • визовый режим — стоимость визы, сложность оформления, необходимость подтверждать доходы;
  • климат — не всем подходит сухой воздух степей или тропическая влажность;
  • инфраструктура — особенно важно для путешествующих с детьми;
  • зов сердца — у каждого из нас есть места, которые хотелось увидеть всю жизнь.

Аналитики компании CircleLoop, разработавшие облачную телефонию для кочевников, предлагают подходить к делу глобально. Они собрали в таблицу данные о 85 странах, наиболее популярных у номадов. Учитывается не только стоимость Интернета и арендной платы, но и, например, индекс счастья. Выше всего он в Швейцарии и скандинавских странах — Дании, Финляндии и Норвегии.

Наиболее привлекательными исследователи сочли Канаду, Англию и Румынию. Но мнение самих цифровых кочевников с этим расходится. Они составляют свой рейтинг, и в его первой десятке всегда есть Индонезия и Таиланд.

Из европейских стран в топ-10 стабильно входят Португалия, Венгрия, Германия, Польша и Сербия. Из Западного полушария — Аргентина и Мексика

Как ни странно, в десятку лидеров не попадают США. Основной причиной дипломатично называют неразвитую транспортную сеть, рассчитанную в основном на автомобилистов.

Как можно получить визу digital nomad

В Хорватии с 2021 года действует специальная виза цифрового кочевника (она так и называется). Ввели ее благодаря бизнесмену Яну де Йонгу — он написал официальное письмо премьер-министру Хорватии, и другие nomads поддержали обращение. Аналогичные разрешения для въезда есть и в других странах. Мы собрали самые интересные варианты 2022 года, где практически нет ограничений для жителей России.

Страна Стоимость визы Срок Какие документы нужны
Аргентина 120 долларов — при подаче документов до въезда, 240 — при оформлении в Аргентине 180 дней Действующий договор о трудоустройстве
Бразилия 72 доллара 365 дней Подтверждение дохода, свидетельство о рождении, аналоги ИНН и электронной подписи, справка об отсутствии уголовного преследования и судимости
Коста-Рика 100 долларов 365 дней Медстраховка, подтверждение трудоустройства в зарубежной (не костариканской) компании, выписка с банковского счета за последний год.
ОАЭ 1 000 долларов 3 года Лицензия фрилансера, медстраховка, выписка со счета в банке
Бермуды 260 долларов 365 дней Рабочий контракт или договор на обучение, медицинская страховка, справка об отсутствии уголовного преследования и судимости, справка о доходах или состоянии счета в банке
Багамы 1000 долларов по запросу Медстраховка, договор о трудоустройстве или обучении
Греция 75 евро 2 года Договор аренды, подтверждение доходов и трудоустройства.

*Данные в таблице действительны на момент публикации. Паспорт обязателен везде.

Также в ряде государств есть разрешения длительного пребывания, которые вполне подходят цифровым кочевникам. Но их нужно изучать внимательно. Например, обладатели визы LTR в Таиланде могут находиться в стране рекордно долго — до 10 лет. Но для ее получения нужно не только подтвердить доход, но и заплатить единоразово 50 000 тайских батов — на момент подготовки статьи это более 80 000 российских рублей. Впрочем, здесь тоже на первом месте принцип личного выбора: часть номадов путешествует по туристическим и даже ученическим визам.

Основные банковские вопросы для цифровых кочевников

В Mastercard уже анонсировали Nexo Card. Это криптовалютная карта, где проценты по долгу не начисляются, если он меньше 20% от стоимости цифровой валюты, привязанной к карте. Теоретически ей можно расплачиваться в любой точке мира, где принимают криптовалюту. Но пока Nexo Card работает только в отдельных европейских странах. А для остальных есть более традиционные способы расчетов:

  • наличка — вариант на любителя, можно довольно много потерять при конвертации, в ряде стран есть ограничения на ввоз. С другой стороны, купюры всегда под рукой и в них удобно хранить НЗ;
  • отдельные карты для каждой страны — для тех случаев, когда вы планируете жить в стране более трех месяцев или путешествовать внутри государств, которые принимают карты друг друга;
  • UnionPay — ее поддерживают 180 стран.

путешествие на природу

В 2020-м части номадов пришлось на несколько месяцев задержаться на одном месте из-за пандемических транспортных ограничений. На этот случай лучше иметь запас кэша, которым можно воспользоваться сразу, без привязки к цифровым системам.

Связь и Интернет

Средняя скорость мобильного интернета в России — 21,1 Мбит / сек. В Китае и Арабских Эмиратах — от 129,62 Мбит / сек до 898,35 Мбит / сек. Мобильный интернет в этих государствах считается самым быстрым в мире, сопоставимые скорости есть только в Австралии.

Что касается широкополосного доступа, здесь лидируют Сингапур и Гонконг — более 200 МБит / сек. Из европейских стран самый быстрый интернет может предложить Румыния, 188,55 Мбит / сек. В России этот показатель почти втрое ниже: около 81 Мбит/с в среднем по стране.

Краткий вывод: без связи вы точно не останетесь, особенно в передовых азиатских государствах. И там интернет почти наверняка будет быстрее и стабильнее, чем в России.

Выбор VPN для обеспечения цифровой безопасности

Многие кочевники выбирают VPN под определенную страну и устройство, поэтому рекомендовать конкретные программы сложно. Но есть критерии, которые стоит учитывать на любом краю земли:

  • обязательные протоколы OpenVPN и WireGuard (их может быть больше, но эти два — базовый рабочий набор);
  • количество серверов в разных странах (чем больше, тем лучше);
  • их расположение: если вы находитесь в Скандинавии и подключаетесь через австралийский сервер, скорость интернета сильно упадет;
  • надежность соединения — сервера должны быть всегда доступны. Если они не отвечают, часть сайтов перестает открываться, а другая часть — начинает сильно тормозить;
  • шифрование не ниже 256-бит, если опасаетесь утечки данных;
  • логи — безопаснее та программа, которая не хранит учетные записи пользователей;
  • тип и количество устройств, которые вы собираетесь подключать;
  • дополнительные опции: например, резервное копирование файлов в облако или поддержание связки VPN + TOR.

Номадс похожи на ящерку

Номадс похожи на ящерку — тем, что переходят от наблюдения к действию в один момент

Медицинское страхование для цифровых кочевников

https://wordpress-1415896-5271829.cloudwaysapps.com/articles/strahovka-dlya-puteshestvennikov-mediczinskaya-i-turisticheskaya-strahovka-dlya-bezopasnyh-poezdok/

 

Если место пребывания меняется чаще 3-4 раз в год, удобна глобальная медицинская страховка. Некоторые международные компании уже разработали варианты именно для номадов. Например, safetywing.com предлагает страховку от 42 долларов в месяц с максимальным покрытием в 250 000 долларов. При этом в договор дополнительно к каждому взрослому можно включить одного ребенка младше 10 лет. Тариф покрывает не только болезни, но и страхование на случай форс-мажоров, стихийных бедствий, задержки в поездке, потери багажа и даже личной ответственности. Если же вы планируете остаться на одном месте дольше трех месяцев, разумно рассмотреть тарифы в конкретной стране.

FAQ: 6 самых частых вопросов о цифровом кочевничестве

Сколько digital nomads в разных странах?

В США — больше 4 миллионов человек (по данным 2020 года). Точной статистики по России пока нет.

Сколько зарабатывают кочевники?

По статистике международного сообщества, доход большинства цифровых кочевников — от 25 000 до 250 000 долларов в год.

Все кочевники — IT-специалисты?

Не обязательно: кочуют фотографы, дизайнеры, монтажеры видео, продакт-менеджеры и даже юристы. Есть обладатели нескольких профессий: от путешествий можно получить столько энергии, что ее хватает и на работу, и на обучение.

Есть ли дом у цифровых кочевников?

Всегда есть место, которое дает больше всего радости и силы, куда приятнее возвращаться. Иногда домом могут называть и более конкретную материальную привязку — например, жилье в какой-то стране.

Где искать единомышленников?

Nomad List — самое популярное международное сообщество цифровых кочевников (членство в сообществе платное).

Nomad Soulmates — «служба знакомств», где можно искать спутника для жизни или для конкретного путешествия.

https://t.me/digitalnomadsdv — русскоязычный чат: лайфхаки, новости, полезные ссылки и вакансии по странам.

https://vk.com/smenastation — паблик российского коливинга «Станция Смена».

Как часто надо переезжать с места на место?

Исследователи из США подсчитали, что цифровой кочевник живет на одном месте в среднем 70 дней. Но это не указание, а данные для размышления. Можно переезжать и раз в 2-3 месяца, и раз в два-три года. Периодичность нужно выбирать только по себе, без подражания и искусственных ограничений.

Обязательно ли путешествовать по миру или можно выбрать один регион?

Путешествия внутри своей страны так же увлекательны, как перелеты через океан. Каждый выбирает то, что ему подходит, и сам решает, как это будет происходить. Объединяет не количество или регион путешествий, а образ жизни и мыслей.

Плюсы и минусы независимости от места

Преимущества кочевничества

  • Свобода. От стереотипов, чужого мнения, негласных ограничений отдельной страны. От привязки к местности и предписанных жизненных сценариев: важно то, что подходит конкретному человеку, а не обществу.
  • Разнообразие опыта. Среди цифровых кочевников есть те, кто путешествует в домах на колесах, и те, кто объехал больше 30 стран. И они с удовольствием делятся опытом с начинающими.
  • Ориентирование на местности. Кочевники легко находят недорогие билеты на самолет, умеют оформлять визы за один день, быстро понимают, как лучше всего передвигаться по новой стране. И знают об окружающем мире в разы больше, чем обычные туристы.
  • Красота мира. Увидеть тропический лес, действующие вулканы, заброшенные древние города — это не привилегия избранных. Для номадов это часть жизни, нематериальное сокровище, которое дороже денег.

Недостатки кочевничества

  • Уединение, переходящее в одиночество. Экстравертам сложно без общения, если они останавливаются не в городе. Да и убежденным интровертам иногда не хватает поддержки или живых встреч. Идеально, когда путешествия помогают кочевнику найти внутреннюю опору в самом себе.
  • Минимализм. Чем больше вещей, тем сложнее их перевозить. Если появляется мебель или техника, без которой вообще никак, нужен грузовой контейнер или несколько грузовых мест в самолете. Это расходы, дополнительное планирование, да еще и риски: 100% сохранность груза не гарантирует ни одна компания.
  • Привыкание. Консерваторы через какое-то время устают от перемен и необходимости адаптироваться к чужим культурам. Для сторонников ярких впечатлений путешествия, наоборот, превращаются в обыденность. Важно найти свой ритм: не превращать кочевничество в бешеную гонку, уметь вовремя остановиться и чувствовать, когда приходит время двигаться дальше.
  • Приоритеты. Цифровой кочевник должен быть организован и дисциплинирован, чтобы не потерять постоянный доход. Как бы ни хотелось пойти пешком вглубь страны во время срочного проекта. А значит, working-трекеры, ревью и рабочие переписки никуда не денутся.

кофейная плантация

Зато в перерыве между задачами можно заехать не к автомату, а на кофейную плантацию

Как справляться с критикой и переживаниями близких

Цифровые кочевники имеют право на понимание, но не всегда его находят. Если ровесникам легко объяснить все плюсы бесконечного путешествия, то от более старших родственников можно услышать и «Ты нас бросаешь», и «Ваш этот номадизм — это секта», и «Как ты будешь там жить, это же другая страна»…

Для налаживания контакта есть свои лайфхаки. Это базовые вещи, которые действительно помогают достичь взаимопонимания.

  • Рассказывайте и показывайте. И не только виды. Убедительны бытовые мелочи: ближайший банкомат находится через дорогу, летняя обувь стоит вдвое дешевле, чем в России. Человек, который за вас тревожится, будет отчетливо понимать, что вы в безопасности и не погибаете без благ цивилизации.
  • Помогайте близким. Даже на расстоянии. Оформить доставку, записаться к врачу через новый портал, найти отзывы о конкретном предприятии — не у всех получается сделать это онлайн с первого раза, а цифровые кочевники даже из другой страны справляются быстро и легко.
  • Объясняйте без агрессии. Спорить лучше хладнокровно и методично, спокойным голосом, логически подкрепляя каждый аргумент. Если ответом на вопросы будет крик или оскорбления, вы ничего никому не докажете.
  • Мягкие аргументы бессильны? Есть волшебное слово, безоговорочно понятное всему поколению 40+: командировка. Да, на удаленной работе они тоже бывают. Да, обязательно именно в эту страну. Да, все документы выдаются в электронном виде. Деньги уже перевели. Всё будет хорошо!

путешествие на острова

Некоторые кочевники говорят, что в путешествиях они проживают не одну жизнь, а несколько. Это своего рода талант, и если вы уже ощутили его в себе — стоит как минимум попробовать его развивать.

Комментарии 0


    Привет! Я из Питера и
    расскажу тебе о городе

    Знаю много мест в Риме —
    заходи ко мне в профиль
    оставайтесь
    с нами
    и узнавайте новое
    Но сплочённость команды профессионалов
    говорит о возможностях направлений.
    Нажимая кнопку “Подписаться”, я соглашаюсь с условиями
    политики конфиденциальности