Анализ дружеских связей VK с помощью Python / Хабр
Совсем недавно на Хабре появилась статья о реализации дружеских связей в ВКонтакте с помощью Wolfram Mathematica. Идея мне понравилась, и, естественно, захотелось сделать такой же граф, используя Python и d3. Вот, что из этого получилось.
Внимание! В статье будут присутствовать части кода, описывая самые важные действия, но следует учесть, что проект претерпит еще не одно изменение в своей кодовой базе. Заинтересовавшиеся могут найти исходники на GitHub.
Разобьем задачу по элементам:
- Создание и авторизация приложения.
- Получение данных.
- Визуализация графа.
Что для этого нам понадобится:
- Python 3.4
- requests
- d3
- Mozilla FireFox, так как в Chrome нельзя использовать XMLHttpRequest для загрузки локальных файлов (никто не мешает сделать python -m http.
Создание и авторизация приложения
Чтобы получить доступ к API ВКонтакте, нам необходимо создать Standalone-приложение, после чего мы сможем использовать нужные нам методы API, которые будут описаны далее. Приложение создается здесь — выберем Standalone-приложение. Нас попросят ввести код-подтверждения, высланный на мобильный, после чего мы попадем на страницу управления приложением. На вкладке Настройки нам пригодится ID приложения для получения access_token.
Далее нам надо авторизовать наше приложение. Этот процесс состоит из 3х этапов.
Аутентификации пользователя на сайте ВКонтакте
Для этого сформируем url, как показано ниже:
https://oauth.vk.com/authorize?client_id=IDприложения&scope=friends,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.21&response_type=token
Цитируя vk.
com/dev/auth_mobile:APP_ID – идентификатор Вашего приложения;
PERMISSIONS – запрашиваемые права доступа приложения;
DISPLAY – внешний вид окна авторизации, поддерживаются: page, popup и mobile.
REDIRECT_URI – адрес, на который будет передан access_token.
API_VERSION – версия API, которую Вы используете.
В нашем случае PERMISSIONS — это доступ к друзьям и к API в любое время со стороннего сервера (бессрочный токен). Если адрес сформирован правильно, нам предложат ввести логин и пароль.
Разрешение доступа к своим данным
Далее разрешаем приложению доступ к необходимой информации:
Получение access_token
После авторизации приложения клиент будет перенаправлен на REDIRECT_URI. Нужная нам информация будет заключена в ссылке.
https://oauth.vk.com/blank.html#access_token=ACCESS_TOKEN&expires_in=0&user_id=USER_ID
Редактируем файл settings. py, вставляя туда полученные access_token и user_id. Теперь мы можем осуществлять запросы к API ВКонтакте.
Получение данных
Для начала разберем методы, которые будем использовать для данной цели.
Поскольку нужна хоть какая-то информация об id пользователя, по которому будет строиться граф, нам пригодиться users.get. Он принимает как один id, так и несколько, список полей, информация из которых нам необходима, а также падеж, в котором будет склоняться фамилия и имя. Мой метод base_info() получает список id и возвращает информацию о пользователе с фотографией.
def base_info(self, ids): """read https://vk.com/dev/users.get""" r = requests.get(self.request_url('users.get', 'user_ids=%s&fields=photo' % (','.join(map(str, ids))))).json() if 'error' in r.keys(): raise VkException('Error message: %s. Error code: %s' % (r['error']['error_msg'], r['error']['error_code'])) r = r['response'] # Проверяем, если id из settings. py не деактивирован if 'deactivated' in r[0].keys(): raise VkException("User deactivated") return r
Это может быть важно для тех, кто захочет отправлять в него id из friends.getMutual, таким образом произведя на свет огромное число запросов. Об этом позже.
Теперь нам надо получить информацию о друзьях пользователя, в чем нам и поможет метод friends.get. Из всех его параметров, перечисленных в документации, используем user_id, который находится в нашем
def friends(self, id): """ read https://vk.com/dev/friends.get Принимает идентификатор пользователя """ r = requests.get(self.request_url('friends.get', 'user_id=%s&fields=uid,first_name,last_name,photo' % id)).json()['response'] #self.count_friends = r['count'] return {item['id']: item for item in r['items']}
Далее наступает самое интересное.
Список id общих друзей между двумя пользователями возвращает метод friends.getMutual. Это хорошо, потому что мы получаем только id, а более расширенная информация у нас уже есть, благодаря friends.get. Но никто не запрещает сделать вам лишнюю сотню-другую запросов, используя users.get. Схемы расположены чуть-чуть пониже.
Теперь определимся, как будем использовать friends.getMutual. Если у пользователя N-друзей, то надо сделать N-запросов, чтобы по каждому другу мы получили список общих друзей. К тому же нам надо будет делать задержки, чтобы у нас было допустимое количество запросов в секунду.
Предположим, что у сканируемого нами id есть 25 друзей.
Всего 52 запроса — это слишком многовато, поэтому вспомним, что users.get может принимать список id:
25 друзей — 28 запросов, но как писалось выше, информация у нас уже имеется, благодаря friends.get.
И тут нам пригодится execute, который позволит запустить последовательность методов. У него есть единственный параметр
То есть в итоге код в VKScript будет примерно таким:
return { “id": API.friends.getMutual({"source_uid":source, "target_uid":target}), // * 25 ... };
Найдитесь те, кто напишет, как сократить данный код, не используя все время API.friends.getMutual.
Теперь нам надо всего лишь отправлять партиями id друзей по 25 в каждой. На нашем примере схема будет выглядеть так:
А ведь мы могли с помощью for отправлять каждого друга в friends.getMutual, а потом еще узнавать более детальную информацию через users.get.
Далее составим человеко понятную структуру, где уже вместо id друга и списка id ваших общих друзей, будет информация из friends. get. В итоге получим нечто вроде:
[({Ваш друг}, [{общий друг}, {еще один общий друг}]),({Ваша подруга}, None)]
В словарях находится id, имя, фамилия, фото, в списках — словари общих друзей, если общих друзей нет, то None. Кортежами все это разделяется.
def common_friends(self): """ read https://vk.com/dev/friends.getMutual and read https://vk.com/dev/execute Возвращает в словаре кортежи с инфой о цели и списком общих друзей с инфой """ def parts(lst, n=25): """ разбиваем список на части - по 25 в каждой """ return [lst[i:i + n] for i in iter(range(0, len(lst), n))] result = [] for i in parts(list(self.all_friends.keys())): # Формируем code (параметр execute) code = 'return {' for id in i: code = '%s%s' % (code, '"%s": API.friends.getMutual({"source_uid":%s, "target_uid":%s}),' % (id, self.my_id, id)) code = '%s%s' % (code, '};') for key, val in requests.get(self.request_url('execute', 'code=%s' % code)).json()['response'].items(): if int(key) in list(self.all_friends.keys()): # берем инфу из уже полного списка result.append((self.all_friends[int(key)], [self.all_friends[int(i)] for i in val] if val else None)) return result
Итак, если хочется посмотреть свой список друзей и общих с ними друзей, запускаем:
python main.py
Визуализация графа
Выбор пал на d3, а именно на Curved Links. Для этого надо сгенерировать json, который будет примерно такого содержания:
{ "nodes": [ {"name":"Myriel","group":1, "photo": "path"}, {"name":"Napoleon","group":1, "photo": "path"}, {"name":"Mlle.Baptistine","group":1, "photo": "path"} ], "links":[ {"source":1,"target":0,"value":1}, {"source":2,"target":0,"value":8} ] }
Немного видоизменяя index.html, узлами становятся фотографии друзей.
Если хочется сразу визуализировать граф:
python 2d3.py
В папке web появится файл miserables.json. Не забываем открывать index.html в Mozilla FireFox или используем python -m http.server 8000 и открываем в Chrome.
Визуализация подтормаживает при большом количестве друзей, поэтому на будущее я думаю об использовании WebGL.
Так выглядит граф дружеских связей одного из моих друзей. Связи — это все.
Конечно, мне было интересно, у кого работает быстрее.
В статье, которая меня вдохновила, написано:
На моих 333 друзьях это заняло 119 секунд.
На момент написания этой статьи, у Himura в ВКонтакте был 321 друг. У меня это заняло 9 секунд (работа всей программы, а не одного friends.getMutual).
В заключение
Всю необходимую информацию об использованных методах можно найти в щедро написанной документации ВКонтакте, однако мной была обнаружена пара ошибок: не была описана ошибка с кодом 15 (‘error_msg’: ‘Access denied: user deactivated’, ‘error_code’: 15), догадаться можно, что она значит, и uid вместо user_id в документации к методу friends. get. Спустя 2 дня:
Как говорилось вначале, проект можно найти на GitHub, буду рад, если он понравится ещё кому-то и я получу много вкусных пулл реквестов…
UPD (27.05.2014):
Как мне подсказал WTFRU7, я добавил возможность использования хранимых процедур. Для этого нужно перейти по ссылке.
Создаем хранимую процедуру getMutual. Копируем содержимое execute_getMutual.js в форму и сохраняем. Не забываем скачать более новую версию. Финальный вид нашей схемы будет таким:
UPD (16.06.2014):
Получаем бессрочный токен.
UPD (11.07.2014):
Добавлены схемы-пояснения.
UPD (14.11.2014):
Продолжение
Dota 2 подарки другу
SR
EG
The Lima Major 2023
Entity
TLN
The Lima Major 2023
GG
Liquid
The Lima Major 2023
TLN
SR
The Lima Major 2023
Liquid
TLN
The Lima Major 2023
GG
Liquid
The Lima Major 2023
NaVi
14:00 12. 03
Ds
DPC EEU 2023 Tour 2: Дивизион I
OM
17:00 12.03
Hydra
DPC EEU 2023 Tour 2: Дивизион I
SMG
08:00 13.03
BI
DPC SEA 2023 Tour 2: Дивизион I
BLEED
11:00 13.03
AG
DPC SEA 2023 Tour 2: Дивизион I
Execration
14:00 13.03
Polaris
DPC SEA 2023 Tour 2: Дивизион I
Monaspa
16:00 13.03
Ooredoo Thunders
DPC WEU 2023 Tour 2: Дивизион I
OG
19:00 13. 03
Tundra
DPC WEU 2023 Tour 2: Дивизион I
Liquid
22:00 13.03
GG
DPC WEU 2023 Tour 2: Дивизион I
VG
07:00 14.03
YG
DPC CN 2023 Tour 2: Дивизион I
Подарки сопровождают любые праздники и поздравления друзей в нашей реальной жизни, и выполняют такую же роль в жизни виртуальной — они присутствуют и в Dota 2. Чаще всего друзья просто отправляют или получают подарки, но в некоторых случаях случается неожиданное — вы понимаете, что отправили подарок не тому другу, или вам нужно вспомнить, от кого вы получили тот или иной подарок. Именно для этого разработчиками была добавлена история подарков, о которой мы расскажем в этом материале.
Информация о текущих правилах отправки подарков друзьям в Dota 2
- Нельзя дарить подарки пользователям, находящимся менее месяца у вас в друзьях.
- Вам необходимо совершить валютную операцию для разблокировки полных возможностей аккаунта в Steam.
- Вам необходимо подключить мобильный аутентификатор Steam.
- Нельзя отправлять в качестве подарка предметы, на которые наложено ограничение обмена после покупки.
- Нельзя отправить в качестве подарка уже отправленный ранее предмет, на который было наложено ограничение на повторную отправку.
- Нельзя отправить эксклюзивный предмет (возможность отправки в качестве подарка указана на предмете в инвентаре Steam).
Как можно посмотреть историю моих подарков?
Для того, чтобы просмотреть историю ваших подарков, вам не понадобится заходить в Dota 2. Вся история доступна напрямую из меню личного инвентаря пользователя в Steam. Для того, чтобы просмотреть необходимую вам информацию, следует действовать по следующему алгоритму:
- Зайдите в свой профиль в Steam.
- Откройте вкладку «инвентарь Dota 2».
- В открывшейся вкладке нажмите на клавишу «ещё».
- В открывшемся меню нажмите кнопку «история инвентаря». «История подарков» содержит в себе только подарки, отправленные друзьям в самой системе Steam.
- После нажатия этой клавиши вам откроется полная история вашего инвентаря, включающаяся в себя данные по всем играм. Также вам станут доступны функции «перейти к дате» и «фильтры».
- Для того, чтобы выбрать только Dota 2, вам необходимо перейти во вкладку фильтры и поставить флажок рядом с соответствующим названием.
- Теперь вам откроется полная история подарков, содержащая в себе и данные только по игре Dota 2. Пожалуйста, обратите внимание на то, что статистика включает в себя не только подарки, полученные или отправленные вашим друзьям, но и подарки, полученные от самой Dota 2 — например, коллекцию сезонных предметов от ивентов.
- Функция «перейти к дате» вызывает календарь, позволяющий вам просмотреть всю необходимую историю подарков за определенный период.
Благодаря этой функции, реализованной компаний Valve для игр в Steam, можно узнать историю своего инвентаря. Следует отметить, что компания часто меняет правила отправки подарков в Steam, опираясь на пожелания пользователей — так, ещё в 2015 году было введено ограничение на отправку предметов в Dota 2 из-за частого мошенничества, а в 2017 году компания ограничила отправку подарков через электронную почту или из инвентаря в угоду прямой отправке из сервиса Steam.
- 0
- 0
Читайте также
-
Как привязать номер к Dota 2
-
Карта
-
Квик касты Dota 2 что это
Авторизация
Запомнить меняЗабыли пароль | Зарегистрироваться
Мемы
top-1 rubick CIS 27Новости
-
Результаты прогнозов на The Lima Major 2023: никто не ожидал провала BB Team и выхода HR в плей-офф
вчера в 20:48 3 4
-
Игроки EHOME, экс-участники Knights и ещё более 40 киберспортсменов были забанены на турнирах от Valve
16 мин. назад 7 17
-
NS: «Faceless Void — это один из паразитов Доты, таких типа отвратительных героев»
57 мин. назад 16
-
Kiritych о присоединении к Virtus. pro: «Буду показывать человеческий уровень игры в Доту»
2 час. назад 2 18
-
Мария Гунина: «Надеюсь, v1olent` не пострадает от разборок больших дядей»
2 час. назад 13
-
«Вот это страсти там кипят» — Maelstorm высказался о конфликте между Nemiga и Sigma. YNT из-за трансфера
3 час. назад 2 2
-
«Я очень обеспокоен судьбой организации и игроков» — менеджер Nemiga о конфликте с Sigma.YNT из-за v1olent`
3 час. назад 2 9
-
YNT расформировала основной состав — слот во втором дивизионе DPC остался у ArsZeeqq
3 час. назад 1 1
Форум
-
муэрта «керри»?
nyashniy 112
Автор: nyashniy
Обновления и патчи
> ох неужели новый керри 20 новых героев и нерфов керри спустя? > главный атрибут: интеллект > пассивка 0. 1 сплитшота медузы > 3 саппортских скилла не пробивающих бкб > талантов…
-
Марс, Муэрта, кого потом добавят?
Waterbird 60
Автор: Waterbird
Герои: общие обсуждения
Марс Греция, Муэрта Испания, логика тоесть. Можно мужика в клетчатой юбке добавить, Шотландия. Немца бы добавил с бочкой пива, аля пандарен в Хотсе. Вот Рики наверное еврей, сразу в инвиз уходит. В Хотсе…
-
В 7. 33 вернут одного курьера на команду?
HealSlut 50
Автор: HealSlut
Обновления и патчи
Ну что, похоже, что те, кто хотел возвращения старой доты, должны быть довольны. Айсфрог снова в деле и вернет нам патчи 6.хх. Для Муэрты записали фразы на покупку и апгрейд курьера, чего для для других…
-
Мои идеи насчет апа Клинкза
FuriousFighter 33
Автор: FuriousFighter
Герои: общие обсуждения
В соседней темке я написал, что аганим и шард Клинкза полное дерьмо: скелеты неуправляемые, атакуют медленно. Еще можно добавить что урона даже с талантом в 20 ед к стрелам недостаточно. Я тут подумал…
-
Nix отлетел
Pivo228gachi 65
Автор: Pivo228gachi
Киберспорт: матчи, турниры, команды и игроки
https://dota2.ru/news/29162-kanal-nix-na-twitch-vremenno-zablokirovali/ вопросы? Я же говорил что добьюсь своего ибо нефиг обманывать со ставками…
-
Ваши расходы и зп
ПОИСК ИГРЫ 20 МИН В 2К17 88
Автор: ПОИСК ИГРЫ 20 МИН В 2К17
Таверна
Сколько в месяц тратите тоталом в среднем? Сколько зарабатываете? Что хотите приобрести, но не можете позволить? Сколько ваших текущих зп помещается в идеальной зп?. ..
-
Knights и EHOME забанили
KraaqIsPerfect 11
Автор: KraaqIsPerfect
Киберспорт: матчи, турниры, команды и игроки
наконец-то мусор получил по заслугам, но перед этим успели залутать копейку за последнее место на мажоре где там говнохранитель фраус и прочие, кто дефали этот мусор, че с лицом пацаны 4 слота на мажор…
-
DPC лига Китая, второй тур. Кто пройдёт на мейджор?
Fraus 13
Автор: Fraus
Киберспорт: матчи, турниры, команды и игроки
Сезон в Китае стартует совсем скоро, уже 14 марта сыграют с Ybb. Напоминаю список участников Этот тур выйдет намного более конкурентноспособным Из прошлого состава Knights остался только один игрок…
-
посоветуйте наушники для компа
nikomuneskaju 16
Автор: nikomuneskaju
Игровые девайсы, периферия и прочая техника
всем ку! хочу приобрести аудиофильные наушники для прослушивания музыки на компе. но в этом вообще не шарю. че купить посоветуйте…
-
Сказала что хочет быть другом
me11 50
Автор: me11
Таверна
Я перелайкал всех милф и начал спускать возрастную планку и лайкать малолеток. Без всякой надежды, спамя сразу сходу пойдем развлечемся. Как не странно но тактика лайкни 100 баб и 3 тебе дадут сработала…
-
Nix, да что ты такое?
Ответственный 11
Автор: Ответственный
Медиа Dota 2
За сутки до патча Сашенька решил порадовать нас инсайдами: Инсайды А вчера и вовсе сказал, что его предсказания сбылись на 99% 99% Как это работает? . ..
-
Баги патча
NexIngredior 9
Автор: NexIngredior
Обновления и патчи
Вышедший патч, от которого никто не проблевался вышел не без изъянов ворвался к рандомным челикам в стак, попросили на 4 сыграть, ок выкатил своего вижу вражеский на варде лес фармит с 1/3 HP. Вкатываюсь…
Стримы
Представляем VK 75.01 (K)
youtube.com/embed/xf1Mja1wV7g?fs=1&mute=0&modestbranding=0&controls=1&showinfo=1&cc_load_policy=1&rel=0&iv_load_policy=1&autoplay=0″ frameborder=»0″ webkitallowfullscreen=»» mozallowfullscreen=»» allowfullscreen=»»>Субтитры на поддерживаемых нами языках также доступны, если щелкнуть значок в правом нижнем углу.
Gamescom стартует 21 августа в Кёльне, Германия. Поскольку на прошлых мероприятиях были представлены средние танки Primo Victoria и T26E3 Eagle 7 (среди прочего), в этом году мы следуем их примеру и представляем нечто, гм, более весомое.
У нового немецкого тяжелого танка VIII уровня VK 75.01 (K) есть кое-что, от чего большинство конкурентов уклоняются: задняя башня. По стилю игры похож на VK 45.02 (P) Ausf. B и Pz.Kpfw. VII на IX и X уровне соответственно. Машина оснащена пушкой IX уровня, обеспечивающей 490 альфа урона и 226 мм пробития (вроде той, что прославила Е 75… и внушала страх).
Используйте его огневую мощь в сочетании с отличным обзором, большим запасом очков боеспособности и прочной лобовой броней, чтобы продвигаться вперед и сокращать расстояние между вами и вашими врагами или скрываться за углами с помощью задней турели. Выбери свою тактику!
Не забывайте: как машина VIII уровня VK 75.01 (K) подходит для «Линии фронта» — 7-й эпизод продлится до понедельника, 26 августа!
ПРЕДЛОЖЕНИЕ НАЧИНАЕТСЯ: среда, 21 августа, 16:20 по тихоокеанскому времени | 06:20 КТ | 07:20 ET |
VK 75.01 (K) War Chest: $82,99 (скидка 19%)
Комплектация:
- VIII ВК 75.01 (К)
- Получите XP за первые 40 побед в ВК 75.01 (K)
- 100% Crew
- 5,000 Золота
- 5,000,000 Кредитов
- 1×Слот в Ангаре
9 8 8 КУПИТЬ СЕЙЧАС
VK 75. 01 (K) Ultimate: $59,99 (скидка 10%)
Комплект поставки:
- VIII ВК 75.01 (К)
- Получите опыт за первые 20 побед в ВК. 2
- 10× Личные резервы: +200% к опыту экипажа (1 час)
- 30 DaysWoT Premium Account
- 1×Слот в Ангаре
КУПИТЬ СЕЙЧАС
VK 75.01 (K) В комплекте: $51,99 (скидка 6%)
Комплект поставки:
- VIII ВК 75.01 (К)
- 100%Экипаж
- 1×Улучшенная вентиляция класса 3
- 1×Крупнокалиберный танковый досылатель
- 1×Вертикальный стабилизатор Mk. 2
- 5× Личные резервы: +200% к опыту экипажа (1 час)
- 1×Слот в Ангаре
КУПИТЬ СЕЙЧАС
VK 75.01 (K): $36,99
Комплектация:
- VIII ВК 75.01 (К)
- 100% Экипаж
- 1×Гараж
КУПИТЬ СЕЙЧАС
Поделиться в социальных сетях
Блог— Miles & Macros, LLC
25.04.2021
0 комментариев
Белолицая небесная гонка 2016. Фотография сделана Mountain Peak Fitness
Популярность забегов на вертикальный километр (ВК) растет. Итак, что такое ВК? ВК – это практика бега в гору как можно быстрее. Участники карабкаются по крутым горам, поднимаясь на 1000 м по трассе, обычно не превышающей 5 км.
Меньшие версии ВК появляются повсюду, называя себя Uphill Challenges. Эти проблемы встречаются в основном в США, поскольку у нас нет достаточной высоты в наших «горах», как у наших европейских конкурентов. Несмотря на то, что у нас нет высоты, подъемы в гору по-прежнему требуют огромных физических усилий и быстрого увеличения высоты или небольшого количества миль.
Независимо от названия вашей гонки, VK или Uphill Challenge, как вы готовитесь к такому событию?
1. Найдите холм и придерживайтесь его адаптироваться к бегу по крутому склону. Однако вам не нужно переезжать в Альпы, чтобы тренироваться. Просто выберите местный холм и бегите вверх по нему. Спринты должны быть продолжительностью от 8-15 секунд. В конце каждого повторения медленно возвращайтесь назад, прежде чем приступить к следующему усилию.
Это очень сложная тренировка, направленная на повышение силы и эффективности лазания. Необходима правильная разминка, и хорошей идеей будет начинать спринт с умеренных усилий и наращивать скорость по мере выполнения нескольких повторений.
2. Легкие ножки
Найдите легкую обувь с выступами, которые могут «вгрызаться» в землю. На любом расстоянии ношение наименьшего веса будет полезным и будет складываться. Обувь, обеспечивающая сцепление, улучшит сцепление и предотвратит скольжение назад, когда местность становится крутой.
3. Знать трассу и ее содержание
В своей первой горной гонке я совершил огромную ошибку, недостаточно хорошо изучив трассу. Оценки на бумаге/картинках не отражают того, насколько крутым и сложным может быть курс! Во время моей гонки я не был морально готов ко всему лазанию, и я вышел, жалея, что не сделал больше в своей подготовке.4. Психологическая подготовка
Как я упоминал выше, подготовка к трассе, а также уровень ваших усилий и физическая нагрузка на мышцы, которые вы обычно не используете при беге по ровной дороге, имеют решающее значение. Воспринимаемое напряжение в этих гонках в гору / ВКонтакте будет выше, чем в гонке на 5 или 10 км по шоссе. Очень важно управлять своими ожиданиями и уровнем усилий, чтобы вы могли закончить гонку сильным!5. Заправка топливом
Может показаться, что время приема пищи для такой короткой гонки не является важным фактором, однако ваше тело будет сжигать много калорий и работать очень усердно. Я бы посоветовал практиковать вашу стратегию питания и прием пищи перед гонкой, чтобы вы могли получить максимальную отдачу от себя в день гонки.
6. Сделайте глубокий вдох
Стоя на стартовой линии, сделайте глубокий вдох и расслабьтесь. Ваше обучение завершено, и вы добрались до старта. Бегать в гору сложно, но весело!7. Короткие быстрые шаги
Подобно езде на велосипеде или автомобиле с небольшим двигателем в гору, использование пониженной передачи будет эффективным способом подняться в гору. В беге это означает, что вы хотите делать короткие, быстрые шаги и концентрироваться на одном шаге за раз.