Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Возможно ли модифицировать чужую игру/программу?

Лучший ответ:
Если программа предоставляет интерфейс для плагинов/модификаций - то можно. Тот же фотошоп - предоставляет. CS:Go в каком то виде - тоже.
Если не предоставляет, то:
1) Это сложно - нужно уметь некисло так программировать и разбираться в предметной области
2) Скорее всего это нарушает лицензионное соглашение

Худший ответ:
Возможно всегда, но сложно.
В плане лицензии - можете, если Вы это делаете со своей приобретённой копией, а на неё у Вас есть все права по использованию, исключая распространение приобретённой копии в любых целях.Пример: Если Вы купили утюг - Вы можете его использовать как угодно, также и с ПО.
Разница - лишь в попытке копирования с применением инструментов по снятию защиты от копирования и/или дальнейшего использования копии ПО с целью получения финансовой выгоды. Т.е. это - уже воровство.
Иначе - можете делать что угодно со своей легальной копией приобретённого ПО в личных целях.
Вопрос: Создание личного сайта 18+?

Лучший ответ:
Я бы не советовал ввязываться в self-hosted и self-managed решения, объем технической работы, который необходимо будет выполнить (и продолжать выполнять более-менее регулярно) колоссален, не стоит оно того. Есть специализированные площадки, которые покроют большинство ваших задач, советую начать с onlyfans.com.

Худший ответ:
Хочу создать свой сайт с продажей фото, видео, вирта и приватного чата со мной
Будет называться "Один дома"?

1. Чтоб сайт не заблокировали.
2. Не попасть под статью рф.
Никак. Производство и распространение порнографии в Российской Федерации является уголовным преступлением.
Вопрос: Почему при выводе через echo переменная выводится не там?

Лучший ответ:
Если нужно получить ID, а не выводить его на экран то используйте функцию get_the_ID() или такой код: $post->ID.

Худший ответ:
Даже не знаю как такое загуглить...
А почитать документацию перед началом работы не нужно?
https://developer.wordpress.org/reference/function...
Вопрос: Какой язык программирование выбрать первым для Web'a?

Лучший ответ:
Не ищите лёгких путей, они не приведут к успеху. Выбирайте не язык, а интересную вам область деятельности, в которой он чаще используется.

Худший ответ:
Если фронтенд, то js. Бекенд все выше перечисленое. В js и php низкий порог, в питоне вроде тоже но с ним не работал
Вопрос: Какой монитор на IPS матрице выбрать?

Лучший ответ:
Ну если именно IPS и с ограниченным бюджетом, то всё довольно просто - открываешь Dell серию UltraSharp (индекс модели должен начинаться с U или UP) и берешь максимальную модель, на которую хватило денег.

Худший ответ:
Вот посмтри список market.yandex.ru и отом посмотри чтобы он был у тебя в твоем городе в магазинаах, а то бывает выбрал, а в городе приехать его в живую посмотреть нельзя, только на заказ, а на заказ брать не сильно хочется. Перед покупкой его лучше в живую посмотрет и поставить пару штук рядом и выбрать какой по лучше картинку показывает. Выбирай 2-3 и иди в магаз покупать, я так всегда делаю, выбрал несколько хороших по отзывам потом в живую смотрю какой лучше.
Вопрос: Что делать если не работает pip?

Лучший ответ:
Добавить в PATH. 
Гугли переменные среды

Или даже будет быстрее переустановить питон и при установке поставить соответствующую галочку.

Худший ответ:
Скорее всего, у вас просто не была установлена галочка на работу пипа со всех директорий, или переустановите пайтон, почтавив эту галочку, илм пробуйте выполнять эту команду с директории где находится пайтон
Вопрос: Транслитер, где ошибка?

Лучший ответ:
В срезах. Обе границы среза должны указываться абсолютно, а у вас индекс сбрасывается в 1 каждый раз. Такой изнаночный срез будет возвращать пустую строку.
"abcdef"[3:2] -> ""

Худший ответ:
Один вопрос почему вам нежен такой сложный алгоритм транслейтера если можно зделать проще?:def transliter(string):
  l_dict = {'a':'а','b':'б','v':'в','g':'г','d':'д','e':'e',
      'zh':'ж','z':'з','i':'и','y':'й','k':'к','l':'л','m':'м','n':'н',
      'o':'о','p':'п','r':'р','s':'с','t':'т','u':'у','f':'ф','kh':'х',
      'ts':'ц','ch':'ч','sh':'ш','shch':'щ','ъ':'','ie':'ы','ь':'','ei':'э',
      'yu':'ю','ja':'я'}
  translit_string = []

  for char in string:
    translit_string.append(l_dict[char])
  return "".join(translit_string)
  
  
print(transliter("opa")
Вопрос: Как передать dataframe в JSON и обратно?

Лучший ответ:
Например, pandas.DataFrame.to_json и pandas.read_json

Худший ответ:
Вот это помогло

resultat = json.dumps({"buttons": json.dumps(but), "status": kat_status, "df_mag": df.to_json(orient='records')})

x = json.loads(data["df_mag"])
df = pd.read_json(x, orient='records')
Вопрос: Zyxel USG40, иногда нагрузка ЦП доходит до 98%, в чем проблема?

Лучший ответ:
Зря тут пишут, что телепаты в отпуске. :)
Гляжу в хрустальный шар, и вижу у вас там VPN на ZyXEL'е, правильно?
А потом гляжу сюда: https://habr.com/ru/company/zyxel/blog/428477/
и вижу в комментариях: Традиционная тема — в даташитах указана одна производительность VPN, а в реальных условиях имеем в почти в 3 раза меньше. Иллюзион, практически. И замеры для даташита делаются для UDP (который, IMHO, для VPN-соединения только от житейской скуки использовать можно), и при определенной длине пакета. Предложения технической поддержки заставляют задуматься, не в параллельном ли мире живет она.
P.S. Да-да, про USG60/USG310 речь.
А потом еще смотрю в спецификации https://www.zyxel.com/ru/ru/products_services/Unif...
и вижу, что USG40 почти в 2 раза слабее, чем USG60. А там в комментариях ругаются на низкую производительность USG60. Так что не удивляйтесь, так и должно быть.

Худший ответ:
Иногда нагрузка доходит до 98% и начинает замедляться работы сети, в чем проблема?Судя по описанию, проблема в созвездии тельца, оно в конце января всегда так влияет на цифровую технику.

где посмотреть?Очевидно на веб-морде, если таковая есть. Если же нет, то открывать инструкцию к устройству и смотреть, а потом с исчерпывающей информацией задавать вопрос тут. Телепаты в отпуске.
Вопрос: Как понять [:,: 0] в python?

Лучший ответ:
Дополню немного ответ @sergey-gornostaev
Это срез, вернее даже два.
Дело в том, что в питоне объекты могут поддерживать протокол __getitem__, этот метод вызывается когда объект употребляется с квадратными скобками справа. Значение, указанное в квадратных скобках, будет передано в качестве аргумента этому методу.
Тут есть два нюанса:
В обычном выражении на питоне запятая означает что результат выражения - это кортеж. То. что вычислилось между запятыми, будет элементами кортежа:
x=1,2,3
Второй нюанс заключается в том, что в квадратных скобках питон поддерживает особый такой "синтаксический сахар" называемый срезами (slice).
Вам действительно лучше почитать про срезы в книге. В общем у среза есть три аргумента и все необязательные. Если аргумента три то срез "под сахаром" выглядит так: 3:10:2 - "с третьего включительно по десятый исключительно с шагом 2".
Срез 3::2 - означает "с третьего включительно до последнего включительно с шагом 2"
Шаг можно опустить, по умолчанию он равен 1 и тогда не нужно второе двоеточие. Можно также не указывать и начало среза (типа сначала). Так : означает срез "от начала включительно до конца включительно с шагом 1".
Такие срезы можно указать через запятую.
Фактически фрейм - это трёхмерный массив. Первые два измерения - это высота и ширина, третье - это компоненты цвета.
В вашем примере операцию проводят над всеми пикселями от верха и до низа, по всей ширине но в определённом канале.

Правда, почитайте книгу. Такие вещи нужно осваивать последовательно, а не наскоком.

Худший ответ:
Это называется срез. Похоже, что в данном случае срез по массиву NumPy.
Вопрос: Какие принципы SOLID здесь нарушены?

Лучший ответ:
сразу бросается в глаза O+I я бы сказал
представь, что после нужно будет считать площадь только маленьких фигур (area < 3) или добавится интерфейс с текстурой и нужно будет считать только пушистые.
не, формально принцип O пока еще не нарушен, и класс Box можно расширять, добавляя в потомках getTotalAreaSmall и getTotalAreaFluffy. но Box уже сейчас выглядит не просто как Box (который просто хранит фигуры), а как BoxThatCountsColored, а его потомки будут называться BoxThatCountsColoredAndSmallAndFluffy например :)

Худший ответ:
Сделал через Visitor, по моему получилось неплохо.<?php

interface IVisitor {

	public function getResult();

	public function visit(IShape $element): void;
}

interface IShape {

	public function accept(IVisitor $visitor): void;
}

interface IArea extends IShape {

	public function getArea(): float;
}

interface IFillColor extends IShape {

	public function setFillColor(string $rgb);

	public function getFillColor(): int;
}

trait TFillColor {

	protected $fillColor = 0;

	public function getFillColor(): int {
		return $this->fillColor;
	}

	public function setFillColor(string $rgb) {
		$this->fillColor = (int)hexdec($rgb);
	}
}

class Line implements IArea {

	protected $length;

	public function __construct(float $length) {
		$this->length = $length;
	}

	public function getArea(): float {
		return $this->length;
	}

	public function accept(IVisitor $visitor): void {
		$visitor->visit($this);
	}
}

class Rectangle implements IShape, IFillColor {

	use TFillColor;

	protected $width;

	protected $height;

	public function __construct(float $width, float $height) {
		$this->width = $width;
		$this->height = $height;
	}

	public function getArea(): float {
		return $this->width * $this->height;
	}

	public function accept(IVisitor $visitor): void {
		$visitor->visit($this);
	}
}

class Box {

	/**@var IShape[] $shapes */
	protected $shapes = [];

	public function addShape(IShape $shape): self {
		$this->shapes[] = $shape;

		return $this;
	}

	public function executeVisitor(IVisitor $visitor) {
		foreach ($this->shapes as $shape) {
			$shape->accept($visitor);
		}

		return $visitor->getResult();
	}
}

class TotalAreaWithColor implements IVisitor {

	protected $total = 0;

	protected $color;

	public function __construct(int $color) {
		$this->color = $color;
	}

	public function visit(IShape $element): void {
		if ($element instanceof IFillColor && $element->getFillColor() === $this->color) {
			$this->total += $element->getArea();
		}
	}

	public function getResult() {
		return $this->total;
	}
}

$rect  = new Rectangle(4, 10);
$rect->setFillColor("FF0000");

$line = new Line(10);

echo (new Box())
	->addShape($rect)
	->addShape($line)
	->executeVisitor(new TotalAreaWithColor(hexdec("FF0000")));
Вопрос: Как узнать, что ajax-запрос точно пришёл с моего сайта, а не кто-то пытается сам его вызвать со своей машины?

Лучший ответ:
Сross Site Request ForgeryCross-Site Request Forgery (CSRF) in RoRhttps://samuelmullen.com/articles/csrf-protection-...CSRF-уязвимости все еще актуальны

Худший ответ:
Гарантированно - никак. С помощью того же cURL можно полностью имитировать работу браузера с вашим сайтом.
Вопрос: Недорогой производительный процессор для ASRock Z370 Pro4 на S.1151 V2?

Лучший ответ:
до 10000 - Core i3 8100, 9100F, голдовый пенёк G5400, G5420. Я предпочёл корай, апекс на ультрах, танки на ультрах, видео и фильмы в 2к спокойно(по собственному опыту в связке с 1070)

Худший ответ:
Открываете Юлу или Авито...ищите, находите, покупаете, PROFIT
Вопрос: Как отредактировать .env файл наиболее нативно?

Лучший ответ:
ansible
в конкретном случае - модуль lineinfile

Худший ответ:
Зачем таким морочиться? mcedit/nano/vim - наше все
Вопрос: Хороший линукс-дистрибутив?

Лучший ответ:
Хороший линукс-дистрибутив
чтоб ощутить линь полностью
после установки дебиана, он не запускается
ну так уже же ощутил, на этом можешь остановиться и бежать на виндувс

Худший ответ:
Тут умников стебающихся, дэбыльных тебе до хера понасоветовали хрени всякой, не слушай этих шутников, а просто делай дело!

Одним из самых простых при установке и последующем юзании любой дистр из семейства Ubuntu (Ubuntu, Xubuntu. Lubuntu и пр.), из той же серии Linux Mint.
Можно сказать - установил и сразу можешь юзать.

Ставится с пол-тыка.
А уже какие-то тонкости будешь по ходу изучать, благо манов по дистрам хороших и форумов шквал!
Те же:
Compizomania
Через поиск бьёшь например: - Ubuntu 18.04 после установки или Установка Ubuntu 16.04

Losst
Вопрос: Когда использовать React.memo?

Лучший ответ:
но почему его почти не используют ?
А на основе чего такой вывод? Мне показалось наоборот, всякую оптимизацию используют везде, даже там где она делает только хуже.

 (без собственного состояния)
Внутренний стейт компонента не влияет на результат работы своего memo, memo сравнивает только пропсы.

По логике вещей каждый компонент (без собственного состояния), даже который не использует props, должен быть обернут в memo, но так не делают, почему?

Тут есть условности. У меня например вот такие правила:

Оборачиваем в memo обязательно, если - родительский компонент часто перерендеривается без изменений пропсов вашего компонента. Если ваш компонент не обернуть в memo, то он будет столько же перерендериваться, сколько и родительский. Но тут я бы обернул ваш компонент в родительском в useMemo (если на хуках писать).

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

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

В остальных случаях можно не использовать memo, если на то не указывают исследования производительности конкретно вашего приложения.

Еще важно следить за перерендерами, чтобы родитель не передавал пропсы, у которых на каждом рендере разная ссылка, пример:
<MemoComp onClick={() => console.warn('hello')} />
в таком случае, memo не будет работать. Это можно еще случайно пропустить, если не используете TypeScript/Flow, то вот такой код
<MemoComp isActive={item || isEnabled} />
будет перерендериваться лишний раз, если вдруг окажется, что item это объект с нестабильной ссылкой. 

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

Худший ответ:
memo хранит каждый компонент в памяти, соответственно чем больше сохраненных компонентов, тем больше памяти занято
Вопрос: Как отправить команды подтверждения на оборудование cisco через скрипт python?

Лучший ответ:
может если до питона дорос то и нахрен уже всякие старомодные ftp?
result = ssh.send_command('show run')
with open(f"{device_name}.cfg") as f:
  f.write(result)
хотя можешь потом с помощью питонячего ftplib положить result на фтп, но это ж такое тухлое легаси уже
и это... если у тебя больше одной циске или там жунипера аристы хуевея, то забей на нетмико и посмотри на напалм

з.ы. конкретно эта твоя задача решается совсем просто: scp cisco:running-config .

Худший ответ:
Спасибо всем кто просмотрел, я добавил пару условий в свой скрипт:
net_connect = ConnectHandler(**device)
        command = "copy startup-config ftp:"
        print()
        print(net_connect.find_prompt())
        output = net_connect.send_command_timing(command)
        if "Address or name of remote host []?" in output:
            output += net_connect.send_command_timing(
                "адрес сервера куда будет отправлен бэкап", strip_prompt=False, strip_command=False
            )
        if "Destination filename [zhgn-sw-confg]?" in output:
            output += net_connect.send_command_timing(
                "имя файла можно вписать то же что и hostname", strip_prompt=False, strip_command=False
                )
Да я понимаю возможно для экспертов и "ЧСВ Экспертов" Мой выход будет казаться диким, но я пока только начал изучать python. Возможно в будущим сделаю или найду упрощенный вариант данной задачи. ASAP я выложу его сюда, а пока данной вариант может годиться как временное решение
Вопрос: Какова пропускная способность FM/AM радиодиапазона?

Лучший ответ:
Теоретическую можно посчитать по Шеннону, практическая будет в разы, а то и в десятки раз ниже.

Худший ответ:
https://habr.com/ru/post/303104/

1187.5Гц вот же она
Вопрос: Какой календарь для групповой работы с разграничением прав доступа использовать?

Лучший ответ:
Функцию управления календарём можно поручить одному человеку. Это будет его функция (роль), или одна из его функций. Например, это может быть project manager.

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

 Календарь для каждого сотрудника в этом календаре, то есть, он бы смог создавать события в календаре (например, когда он отсутствует в офисе), остальные могли бы это видеть, но не изменять
Это не совсем целевое назначение календаря. В моем понимании календарь используется для общественных событий. Даже если это семья из двух человек, в календарь идут совместные мероприятия и встречи, а не личные дела (даже если они кого-то могут касаться). Да и как вы себе это представляете? Будет создано событие "отсутствия сотрудника" на целый день в течение 7 дней. Как по мне, крайне не удобный формат.

Тогда можно посмотреть в сторону тупо Гугл Таблиц. Каждому сотруднику - своя вкладка. Или своя ячейка. Но, повторюсь, этим должен заниматься кто-то типа ПМ или секретаря, которому все скидывают свои планы, занятость и прочее, а он уже вписывает в табличку. А не каждый сам про себя пишет. Хотя бы потому, что кто-нибудь обязательно забудет. А задача ответственного будет следить за порядком, опрашивать, и в целом разгрузить других людей от этой бюрократии, чтобы им проще и комфортнее было работать.

Худший ответ:
Не понял почему гугл не подходит?

админ@gmail.com создает календарь.
Добавляет список людей (по адресу почты) и дает права редактировать и читать.

Похожая задача была, но так и не решили. Остались на гугле, т.к. самый лучший календарь. Может уже что то появилось.
Пытался с OwnCloud поковыряться, но IQ не хватило.
Вопрос: Падение рынка дизайна ui/ux за последний год (или нет)?

Лучший ответ:
В 2018-2019 гг. стало больше агрессивно развивающихся онлайн-школ с курсами UI/UX = больше дизайнеров-выпускников = заказы распределяются по большему количеству исполнителей = меньше заказов на одного исполнителя.

Худший ответ:
Просто был пик хайпа Javascript.
Вопрос: Как сделать бэкап файлов в облако?

Лучший ответ:
Из софта - rclone. Далее в скрипт и запускать когда надо

Из облаков - выбирайте по цене что подойдет

Худший ответ:
Вроде бы все облачные клиенты могут мэпить аккаунт на диск. Впрочем все современные бэкапилки могут делать это непосредственно. Ну или вариант напишите батник который через клиент отправляет в облако
Вопрос: Почему не пингуются виртуальные машины?

Лучший ответ:
в фаерволе наверное

Худший ответ:
В них NAT
Вопрос: Как установить память на сервер?

Лучший ответ:
В характеристиках платы указано, что она поддерживает память UDIMM ECC. Если вы установили RDIMM ECC, то она не заведётся.

Худший ответ:
Проверяйте, чтобы память по каналам была правильно раскидана. DDR3L обратно совместима с DDR3
Вопрос: Как сделать систему регистрации на php?

Лучший ответ:
Регистрация это по сути тупо создание записи в базе по определённым тобой правилам через форму на сайте, таким как:
- заполнение обязательных полей
- валидация данных в полях
- проверка на уникальность
И так далее.

Худший ответ:
Я когда впервые в жизни делал регистрацию на PHP решил пойти наиболее простым путем - для каждого e-mail по одному только мне известному алгоритму вычислял хеш, за это отвечала специальная шифрующая функция, а затем этот хеш отсылал в виде пароля на почту. Пользователю надо было вбить свою почту на сайте и с почты открыть отправленную ссылку для авторизации. Таким образом я избежал необходимости использовать базу данных.

Такой подход конечно не совсем правильный с точки зрения безопасности, но в принципе удобен для применения в небольших веб-сервисах для ограниченного круга людей, так как не надо сильно заморачиватся с реализацией.
Вопрос: Bash проверка открытого порта. Как проверить результат работы команды?

Лучший ответ:
Переменная $? содержит результат последней выполненной команды (0=успех)#!/bin/bash

nc -z <host> <port>

if [ $? -ne 0 ]; then
echo 'Открыт'
else
echo 'Закрыт'
fi

Худший ответ:
Bash скрипт без nc, с использованием того же $?echo "" > /dev/tcp/192.168.1.10/443 && echo "Opened" || echo "Closed"
Вопрос: Как проверять regexp?

Лучший ответ:
Вы делаете ошибку, тестируя только правильные варианты. Например, ваша регулярка посчитает правильными: function (, ,) или function(a b). И вы зря не обращаете внимания на примеры в интернете: \w короче и удобнее, чем [a-z0-9_]. Главное же - просто опыт.

Например, зачем повторять \(...\) в каждой группе, если это можно вынести за группировку? И зачем выделять отсутствие параметров в отдельный случай?

Я бы записал в таком виде:
\bfunction\s*(\w+)?\s*\(\s*(\w+(?:\s*,\s*\w+)*)?\s*\)
Но сама по себе идея анализировать язык программирования регулярными выражениями не является удачной:
регулярные выражения реализуют только регулярные грамматики (грамматики типа 3), тогда как для описания синтаксиса языка программирования требуется контекстно-свободная грамматика (грамматика типа 2). Разница между ними в том, что контекстно-свободная грамматика позволяет задавать рекурсивные правила (function внутри function) с неограниченной глубиной рекурсии.

Худший ответ:
Вы делаете ошибку, тестируя только правильные варианты. Например, ваша регулярка посчитает правильными: function (, ,) или function(a b). И вы зря не обращаете внимания на примеры в интернете: \w короче и удобнее, чем [a-z0-9_]. Главное же - просто опыт.

Например, зачем повторять \(...\) в каждой группе, если это можно вынести за группировку? И зачем выделять отсутствие параметров в отдельный случай?

Я бы записал в таком виде:
\bfunction\s*(\w+)?\s*\(\s*(\w+(?:\s*,\s*\w+)*)?\s*\)
Но сама по себе идея анализировать язык программирования регулярными выражениями не является удачной:
регулярные выражения реализуют только регулярные грамматики (грамматики типа 3), тогда как для описания синтаксиса языка программирования требуется контекстно-свободная грамматика (грамматика типа 2). Разница между ними в том, что контекстно-свободная грамматика позволяет задавать рекурсивные правила (function внутри function) с неограниченной глубиной рекурсии.
Вопрос: Почему не открывается изображение?

Лучший ответ:
Скорее всего штатная утилита просмотра изображений несовместима с некоторыми метаданными, в частности, с цветовым профилем, записанным смартфоном, например. Можно преобразовать цветовой профиль (GIMP, Photoshop), удалить метаданные (EXIF Purge, ImageMagick) или добавить совместимый цветовой профиль в систему (так себе решение, так как может потребоваться присобачивать монитору и принтеру стандартный цветовой профиль).

Худший ответ:
на яндекс диске открылся... попробуй сам открыть через яндекс, потом сохранить  как .
Вопрос: С помощью каких технологий лучше всего делать интерактивные географические карты для веб-игр?

Лучший ответ:
Ландшафт можно сгенерировать так, например https://www.playfuljs.com/realistic-terrain-in-130...
А для карт есть фреймворк leaflet.js
Но я бы карты всё же генерировал заранее в каком-либо трехмерном редакторе, там больше возможностей. https://www.blendernation.com/2019/04/01/generatin...
А потом - резал на тайлы и показывал бы через Leaflet.

Худший ответ:
Ну в простейшем случае, может быть достаточно просто взять растровую картинку карты и использовать ее как бэкграунд. Соотвественно, остается научиться ее скролить и масштабировать (+ возможно вращать).
Судя по всему вам этот очевидный подход почему-то не подошел. Раскройте свои требования:
1) какой минимальный и максимальный зум? 
2) предполагаемый размер карты?
3) может быть она должна быть анимированной?
4) 2д или 3д карта?
5) насколько она должна быть интерактивной? можно ли по ней перемещаться (аля Fallout)
и т. д.
Все это поможет подобрать решение.