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'); } } JAPANутая кухня или 1000 и 1 блюдо, не считая суши | TraveCave
ТрэвКейв
Первый в Рунете портал, объединяющий номадов по всему миру 🌎

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

ГлавнаяСтатьиJAPANутая кухня или 1000 и 1 блюдо, не считая суши

JAPANутая кухня или 1000 и 1 блюдо, не считая суши

1239 0

– Какие на вкус самые «трушные» японские суши? И сколько стоит один сет в ресторане?
– Почему в общепите принято громко прихлёбывать при поедании рамена?
– Почему японский завтрак – самое ужасное, что только можно съесть с утра?
– Как в Токио «побороть» замысловатые продуктовые автоматы?
– Что будет если смешать рис, молоко, алкоголь и пшеницу? И возможно ли это вообще пить?

Ну что, приятно заурчало в животе? Надеюсь, что да. Ведь сейчас я поделюсь с вами, пожалуй, самыми вкусными воспоминаниями о Японии. Берём вилки, ложки. Ой, простите. Берём аккуратно палочки для еды. И приступаем …

Пока вы не «углубились» в телефоны в попытке заказать какую-нибудь азиатскую вкуснятину, проведу небольшой ликбез. Он пройдёт быстро и безболезненно.

Суши (суСи)

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

Суши (тьфу!) суси японцы не едят каждый день. Ага, минус ещё один стереотип. Блюдо, захватившее весь мир, уплетают исключительно в выходные или по праздникам. А в рядовые дни в рационе жителя Страны восходящего солнца более простая и скромная пища. Какая? Расскажу чуть ниже.

Далее – суси бывает лишь нескольких видов. Никаких запеченных. Никакой курицы или бекона. Никакого майонеза или дополнительных всевозможных соусов. Никаких панировок и сладких вариантов. Всё, к чему вы так привыкли в наших ресторанах, японцами воспринимается, как рисовые пирожки. Я не шучу. «Rice cakes». Вы бы видели, как расширялись глазки бедных японцев, когда я им рассказывал про наши вариации их легендарного блюда. Смеялись до слёз.

А что же тогда есть? Самое ходовое – это лишь два варианта (соглашусь, негусто). Первый – знакомые нашему глазу «маки». То есть оболочка из водорослей нори + сердцевина из риса, рыбы + огурец/ авокадо/ тофу. Всё. 

Просто, но однозначно вкусно. И второй вид – «нигири». Это комочки риса (скорее даже «лодочки»), а сверху – «покрывало» из рыбной свежатинки (тунец, лосось, сёмга). Причём рыба сырая, её только ошпаривают кипятком. Для обеззараживания умные японцы макают «нигири» в «бульон» из соевого соуса и васаби. И вот это прямо божественно! Свежайшая рыба, конечно, сносит башку.

Пару слов о свежести. Для японцев – это нечто сакральное. У них не бывает второй или третьей свежести. Она либо есть, либо её нет. Чтобы вы понимали их щепетильность, один простой факт. В токийских супермаркетах с утра один ценник на продукты. А вот ближе к вечеру (примерно в 17 или 18 часов) эти же самые позиции реализуют со скидкой в 20-30, а то и 50 %. Почему? Да потому, что за полную цену покупать набор суси, молочные товары или позиции из кулинарии никто не будет. Японцы уверены – если полдня еда полежала, уже «не айс». Хотя срок её еще даже близко не подходит к концу. Как думаете, у нас такая практика возможна?

И главное – цена. Суси в Токио прекрасно и в ресторанах, и в кулинарии обычных супермаркетов (свежатина и там, и там). Бюджетная магазинная опция будет стоить около 300 рублей за 8 штучек. В упаковке предусмотрительно вам дадут палочки, соусы, салфетки. Красота! А вот в рестике специализированном – в 2-3 раза сеты дороже.

Я отстоял очереди в два самых аутентичных, по мнению местных, суси-бара. Это, безусловно, как невероятный гастрономический опыт стоит каждого потраченного «шекеля». В заведениях шикарная атмосфера. Ты – хозяин и господин. Столы располагаются вокруг открытой кухни. За тобой закреплён конкретный кулинарный гуру. Он готовит именно тебе и ПРИ тебе. Разделывает свежайшую рыбу (да, я буду о свежести говорить в этом материале ещё не раз), мастерски орудует замысловатыми ножами, далее что-то скручивает, режет. Настоящая магия! От тебя требуется только забирать «сусинки» с подноса и смаковать. И не потратить всё до последнего пенни.

В целом, я очень кайфовал от заведений с открытой кухней. Выстраивается невероятный «вайб» между тобой и поваром. Вопреки общей закрытости, кулинары-японцы с удовольствием перекинутся с тобой парочкой фраз, пошутят. А параллельно с этим приготовят изысканное, идеальное по вкусу, космически сбалансированное блюдо. «Выверенность» – главная черта японской кухни. Она всегда в меру сытная, солёная, сладкая, горькая, острая. Во рту – регулярно увлекательный вкусовой аттракцион. Например, как в случае с легендарными азиатскими супами.

Если вы ещё с детства относитесь скептически к первым блюдам и для вас это исключительно «каторга» перед горячим и десертом, то японская кухня вас однозначно удивит. Рамен. Вот пишу это слово, уже слюньки образовались во рту. Вы не представляете, насколько фантастический этот суп. В нём – и первое, и второе, и компот. Очень сытно. Основа супа – пшеничная лапша. К ней добавляется томлёная курица (реже свинина или морепродукты), лук зелёный, яйца, водоросли, грибы сиитаке (помним, что «ш» у них отсутствует), иногда ещё сыр тофу. Стоит упомянуть, что есть такой тип рамена, где лапша и бульонная основа подаются в разных тарелках. Данный вариант называют «цукемен». А ещё есть «соба». Это, по факту, любые блюда из гречневой, тёмной лапши (в том числе, супы). По рецептуре похоже на рамен. Только тут чаще всего яйцо подают отдельно. А бульон не на молочной основе, а на соевом соусе. 

Любопытный факт – в Японии для удобства представителей всех конфессий, национальностей сделали «халяльный рамен». Вы не ослышались. Да, есть в Токио и такой мозговзрывающий кулинарный микс. Одно из заведений, на которое я чисто случайно натолкнулся, находится в районе Сибуя и называется TOKYO Honolu Ramen. Необычно, что скажешь. Для справки, во всей Японии, по различным подсчётам, не более 20-30 тысяч мусульман. 

Между прочим, в поедании супа в Японии есть свои правила, логику которых постичь не так-то просто. Прежде всего, здесь принято чавкать и прихлёбывать. И не подумайте, что японцы совсем не знают ничего об этикете. Просто у них это как раз-таки укладывается в понятие «культурно». Помню свой первый культурный шок. Сижу такой в обычной кафешке. Напротив, две миловидные японки щебечут и поедают рамен. И вдруг слышу раскатистые прихлебывания. Я – в смущении и испанском стыде. Им – хоть бы что. Только потом я узнал, что это якобы комплимент шеф-повару. Мол, так вкусно, что аж за ушами трещит (и во рту трещит, видимо, тоже). Я же говорил, что японцы откуда-то с луны свалились!? И второй момент – в супе принято палочками сначала съесть всю густоту. И только потом приступать к бульону. 

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

Напитки

В целом, вендинговая история весьма популярна в Японии. Цветастые автоматы с напитками и едой «понатыканы» не только на основных улицах, но даже в маленьких переулках. Ох, сколько раз я на них проверял известный всем «метод проб и ошибок». Мало того, что не с первого и даже не с пятого раза разберёшься во всех их иероглифах – где и куда нажимать. Да ещё и приходилось «продираться» через бесконечный поток неопознанных и абсолютно неинформативных этикеток. Ориентироваться на картинки нет смысла. На бутылках рисуют, что угодно – покемонов, драконов, ниндзя – но к напиткам и их вкусам это никак не относится. Стоят напитки примерно 100-110 иен, то есть по текущему курсу 40-50 рублей.

В конечном счете я всё-таки смог выбрать что-то своё – это был зеленый чай с жасмином, кофе с молоком и черный чай с лимоном и имбирём. Причём тёплый!

Да, вот такая мелочь. Мы привыкли, что в автоматах или ледяные, или комнатной температуры напитки. Японцы догадались ввести ещё в этот список тёплые. Боже мой, как я радовался такой милой бытовой детальке. Тёплые напитки имеют красные бирки и крышки, а холодные – синие. Очень удобно! Хотя, вроде бы пустяк.

Расширю ещё чуть-чуть ваш «гастрономический кругозор». Среди самых необычных японских напитков я бы отдельно остановился на «амазаке». Его история начинается ещё в четвёртом веке. Амазаке считается «сладким саке». Хотя в нём и нет сахара, зато есть алкоголь – примерно 8 %. То-то мне от него так хорошо и тепло было. Напиток легендарен тем, что он чуть ли не дарит вторую жизнь, если верить японцам. В амазаке – эрготионин, который препятствует старению кожи и обладает противовоспалительными свойствами. А ещё витамины В1, В2 и В6, кислоты разные. И это всё благодаря обычному ферментированному рису. Как они над ним колдуют – бог его знает. Рецепт тщательно скрывают. Из того, что известно – особый какой-то рис варится до состояния кашицы. Затем настаивается в саке под крышкой часов 8-10. С 200 грамм риса и с одного литра воды на выходе получается всего лишь 100 миллилитров удивительного напитка.

В Токио я был ещё очарован местными пельмешами – жареные «гёдза». Главное отличие от наших – экстремально тонкое тесто, его практически не чувствуешь. Плюс в фарше сильно чувствуется чеснок. Его специально нарезают крупно. Так что после гёдза – никаких поцелуев. А если серьёзно – вкусно и сытно. Подают блюдо с соевым соусом или чили.

Если бы в мире не существовало такое блюдо, как «суси», то, наверное, главной гастрономической «визиткой» Японии можно было бы однозначно считать «бенто». По сути, это собирательное название блюд, которые японцы берут с собой на пикник или работу в прекрасных плетёных/ деревянных коробочках. Это целая философия. Японцы те ещё трудяги. Для них поход на обед – скорее исключение, чем правило. В 99 случаях из 100 они просто выйдут из офиса, сядут на скамейку в ближайшем сквере, достанут эту коробочку, которую приготовили родители/ супруги или в крайнем случае купили с утра, и будут скромно, тихо уплетать. В этом алгоритме действий – все японцы. Аппетитно – аккуратно – практично.

Рынок Цукидзи

Но это всё частности. Пусть и весьма занимательные. «Кулинарная душа» Токио – это его легендарный рынок Цукидзи. Полноценная достопримечательность. Здесь на огромной территории (на входе даже выдают карту) перемешались различные многовековые кулинарные традиции Страны восходящего солнца. 

Очень много морепродуктов. Какие-то клешни, усики. Чудовищного вида рыбы соседствуют с чем-то более-менее нам знакомым. Между прочим, за год среднестатистический японец съедает примерно столько же рыбы и морепродуктов, сколько весит он сам. А это, значит, около 60-70 килограмм.

Начинает работать рынок аж с 3 часов утра. Первые посетители – крупнейшие рестораны. Они покупают только-только выловленную рыбу. Ради самых шикарных позиций (например, огромный тунец весом в несколько сотен килограмм) организуют полноценный аукцион. Говорят, баталии невероятные и довольно яркие. Однако я не смог заставить себя проснуться, настолько рано. Приехал в 11 утра. Но тут уже был шум-гам. 

Соленья, варенья, крабы, устрицы, моллюски, мясо (чуть-чуть). От ярких образов и ароматов – голова кругом. Здесь я залип на часа четыре. Хотя меня не назовёшь таким уж любителем шопинга. 

Главный плюс – всё можно здесь попробовать. Практически всё. Есть халявные снеки, закуски. После третьего или четвертого захода во рту ощущается исключительно вкус соли.  

Отдельная «песня» – это шпажки с приготовленными на гриле морепродуктами. Осьминоги. Угорь. Тунец. Всё это в приятном соусе терияки. 

Предугадываю, что вы уже вот-вот готовы унестись на кухню. Подождите. Осталось упомянуть только два удивительных кулинарных факта. Первое (как я и заявлял в самом начале). Японские завтраки – это оооооочень на любителя. Несколько раз их пробовал и переплевался.

Что в него входит? Это бульон с водорослями и рыбными «останками». Ну как, аппетит уже появляется? Вот и у меня нет. Дальше – свежие овощи (салат листовой, морковка). Плюс маринованные томаты. И вершина всего – рисовые пирожки в нори. Внутри пресный рис (как для суси) и рыба, водоросли или авокадо. В общем, такое себе гастрономическое начало дня. Именно поэтому после двух неудачных завтраков «а-ля Japan» я всё-таки стал заказывать в кафе или отелях более привычный европейский вариант. Между прочим, японцы хоть и очень щепетильно относятся к собственной кухне, культуре в целом, но им не чужды и веяния из других стран. Они не боятся экспериментировать. Объединять фастфудные европейские тренды с японскими вкусовыми предпочтениями. Но самое забавное – в Токио есть отсылки и к русской кухне. 

«Роговски»

Трустори. В предпоследний мой день в Токио я медленно прогуливался по роскошному району Гиндза. И вдруг перед входом в одну из обалденных высоток, где первый этаж – это магазины Burberry, Hugo – замечаю вывеску с загадочным Russian Restaurant Rogovski. Смотрю с выпученными глазами минут 5. «Чего? Наше заведение? Да ещё Роговски – это кто, блин, такой»?

Поднимаюсь на 7 этаж. Яркая вывеска, всё из стильного дерева, панорамные окна с «лухари» видом. Захожу, вижу двух белозубых официантов. Пытаюсь в шутку с ними заговорить по-русски. В панике убегают. Возвращается один из них через минуту уже с администратором. Хлопают глазами, по-русски ничегошеньки не понимают. Окей. 

Беседуем по-английски, мне дают меню, там всё в иероглифах, только ценники понимаю. Ого-го-го, какие ценники! Блюдо одно – полторы, две тысячи рубликов (хотя москвичи, думаю, сейчас не удивятся). Комплексы или тематические наборы – вынь да положь уже четыре тысячи. А что именно в наборах? Если судить по картинкам, то блинчики с икрой, бефстроганов, рюмаха водочки, оливье. Ни щей тебе, ни селёдки под шубой, ни пельменей. Эххххх … Так вы, японцы, и не смогли пока что постичь глубокую русскую душу (в «Роговски», по крайне мере, точно). Замысловатые супы, морепродукты и суси у вас получаются на порядок лучше. За это мы вас и обожаем!

 

Комментарии 0
Ташкент
Всем привет. Меня зовут Иван и я веду канал на YouTube "Забугорье" с нетривиальными видеопутешествиями, запоминающимися городскими зарисовками и интервью с иностранцами со всего мира.


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

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