pavki/hr_qa_sbs_best_bad huggingface dataset:
Вопрос: Что можно посоветовать вечному джуниор разработчику?

Лучший ответ: Я вижу, что тут все пишут, что тебе на мидла надо идти, но с этим я в край не соглашусь. Ты джун. Не джун+, не мидл, никто кроме джуна. Есть гораздо важнее проблема в твоей карьере. Ты не умеешь и не хочешь учиться. Разработчиков мало и никого просто так не сокращают. Называй вещи своими именами - тебя уволили. Видимо, ты просто был очень плох. Если даже ты зазубришь вопросы с собесов, тебе это не поможет на самой работе. Обмануть собеседующего можно, но ложь быстро вскорется.

Что тебе с этим делать? Сложно сказать, тебе уже под тридцатник и я не знаю кейсов когда человек в таком возрасте успешно осваивал настолько важный и сложный скилл как самообучение, но попытаться стоит. Как это сделать? 
- Во-первых, не перекладывай ответственность за свое обучение на курсы, учись сам. Начни уже читать книги по программированию, сторренти курсы, пили что-то.
- Научись проявлять инициативу. Стань, что называется proactive
- Не думай, что устроившись на работу можно остановиться учиться. Тебя уже увольняли, а среднячков просто так не увольняют, я думаю, ты ниже среднячка в софт скиллах.
- Выбери уже что-то одно. Бери то что лучше знаешь и начинай штудировать это.

Ну и если отвечать на вопрос "Как попасть на работу и сидеть там до конца жизни?", то просто зазубри их систему (скорее всего это твой путь). И, к слову, у шарперов таких работ много. Код будет говно, роста не будет, денег будет мало, но за то будет работа.

Худший ответ: Это типичный пример эффекта Даннинга-Крюгера
Вопрос: Как лучше использовать библиотеки python в нескольких файлах с кодом?

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

Также посоветую придерживаться норматива PEP8 в плане порядка импорта:
Сначала импорты стандартных модулей.
Потом импорты сторонних библиотек (то что ставил через pip).
В последнюю очередь импорты модулей из твоего проекта.
В каждой секции элементы можно упорядочить по алфавиту, если нет особых причин импортировать их в другом порядке.

Худший ответ: добавлю к словам Vindicar  :
PEP подразумевает еще и экспортирование переменной среды PATH.
Засим, можете сделать:
PATHMYLIB='/path/to/my/libs:$PATH'
export PATHMYLIB
Вопрос: Почему сайты на сервере работают медленно?

Лучший ответ: Гадание на листьях опавших с ветвей сакуры нифига не даст. 

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

Так же есть вероятность что проблема не на бэкенде, а в подгрузке ресурсов типа фонтов или скриптов со сторонних сервисов, которые сейчас работают не очень стабильно (ну да, "а что случилось?"). Опять же легко проверяется разницей между выполнением всего кода и полной загрузкой страницы.

Худший ответ: а че он у Вас в swap уполз? мож ему оперативки не хватает?
Вопрос: Visual Studio Code много не отслеживаемых изменений в Системе управления версиями?

Лучший ответ: Ты не в той директории сделал git init.
Удали папку .git и попробуй ещё раз

Худший ответ: Добрый день!
Проверил. Действительно инициировал git не там куда нужно. Удалил папку, и изменения пропали.
Огромное спасибо за помощь!
Вопрос: Насколько востребован MS Access?

Лучший ответ: Да можно сказать что никак. 
Снизу эксель, сверху взрослые БД.
Что то хранить у клиента используется Sqlite

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

Принципы работы с базами на базе access изучается слишком примитивно.
Вопрос: (selenium) driver.find_element_by_xpath не находит нужный элемент что делать?

Лучший ответ: Хотя этот (//html/body/div[99]/span) xpath путь точно существует
Почему так решили?
Давайте вместе попробуем перейти по этому пути.

html/body/div[99]/span

Открываем html/body


Открываем 99-й div

Но их всего 5. Так что не существует такого XPAth, создавайте новый, в хроме можно даже через райтклик скопировать Xpath

Худший ответ: Возможно надо добавить time.sleep(10) после driver.get
Возможно там iframы есть
Вопрос: В каком конфигурационном файле настраиваются сетевые интерфейсы в Ubuntu, Debian, CentOS?

Лучший ответ: По-разному. Где-то консервативный /etc/network/interfaces, где-то netplan, где-то networkmanager. Гуглите для конкретной версии дистрибутива.

Худший ответ: Вопрос слишком общий.
Даже только CentOS: network-scripts или systemd-networkd или NetworkManager, зависит от того, кто что выбрал при установке и/или настройке.
Хуже - в зависимости от версии (6/7/8/8 stream/9 stream) что-то из вышеупомянутого работать не будет или будет работать некорректно (например network-scripts в 9 или NetworkManager в 6)
Вопрос: Работает ли SCSS, SASS во всех браузерах(втч. мобильных)?

Лучший ответ: В браузере работает только CSS. Всё остальное требует препроцессоров на сервере.

Худший ответ: Препроцессоры это не какой-то отдельный/новый "язык" заменяющий css. Они просто позволяют более комфортно и быстро создавать конструкции в css. 
После написания стилей их нужно преобразовать в css. Чем и как - зависит от многого 
(Можно через ide/gulp`ом/библиотекой для серверного ЯП)
Вопрос: Как подключиться к хосту в локальной сети извне этой локальной сети?

Лучший ответ: почему "проброс порта" не подходит по требованиям, если проброс ровно для этого и создавался ??
озвучьте эти требования и тогда будет дан правильный ответ.

Худший ответ: Вариант именно с порт форвардинг. Иначе то как к серверу подключатся извне? если клиент не может достучаться до этого сервера)))

Вариант решения - проксируйте соединения сервера через свой "сервак"...
Например у клиента поднимается vpn тунель до вашего сервака и открывается нужный порт. В итоге  
кто то стучится на имя вашего сервака>>сервак переадресовывет его на пользователя(который сервер socks)

Ну либо наверно можно без ВПН, каким нить прокси или nginx... ту же схему сделать
Вопрос: Как вернуться к процессу, запущенному через ssh?

Лучший ответ: В tmux запускай. Это что-то вроде виртуальной консоли на сервере. Можно создавать несколько сеансов и всегда к ним возвращаться. Приложение будет работать 24/7 пока не завершится.

Худший ответ: Как посоветовали tmux да (screen бородатый уже), хорошая вещь.
А ещё я пользую не putty, а conemu (ну естественно нужно ssh бинарник (я взял из приложения github для wind-ы),  настроил быстрый запуск и в один клик подключаюсь.
Вопрос: Как понять что сайт быстрый?

Лучший ответ: Смотри оценку Google:
https://developers.google.com/speed/pagespeed/insights/

Худший ответ: Очень просто - открываете мой сайт (на тяжёлой редакции "Эксперт" Битрикса что считается ужасным и тормозным) - кликаете по меню/статьям/новостям и понимаете - вот он быстрый сайт :)  Разумеется можно посмотреть мой сайт и в webpagetest.org или в pagespeed Гугла - там он тоже быстрым будет :)

https://www.babai.ru
Вопрос: Почему жирность текста в css отличается от жирности текста в макете figma?

Лучший ответ: Для изменения жирности нужно подгрузить шрифт с этой жирностью. Браузер сам, конечно, может некоторым образом симулировать жирность или курсив, но если шрифт не системный для каждой жирности, начертания и их сочетаний нужно подгружать свои файлы. При этом их нужно еще корректно объявлять, например:
@font-face {
	font-family: 'Commissioner';
	src: url('fonts/Commissioner/Commissioner-Regular.eot');
	src: local('Commissioner Regular'), local('Commissioner-Regular'),
		url('fonts/Commissioner/Commissioner-Regular.eot?#iefix') format('embedded-opentype'),
		url('fonts/Commissioner/Commissioner-Regular.woff2') format('woff2'),
		url('fonts/Commissioner/Commissioner-Regular.woff') format('woff'),
		url('fonts/Commissioner/Commissioner-Regular.ttf') format('truetype');
	font-weight: normal;
	font-style: normal;
}
@font-face {
	font-family: 'Commissioner';
	src: url('fonts/Commissioner/Commissioner-Medium.eot');
	src: local('Commissioner Medium'), local('Commissioner-Medium'),
		url('fonts/Commissioner/Commissioner-Medium.eot?#iefix') format('embedded-opentype'),
		url('fonts/Commissioner/Commissioner-Medium.woff2') format('woff2'),
		url('fonts/Commissioner/Commissioner-Medium.woff') format('woff'),
		url('fonts/Commissioner/Commissioner-Medium.ttf') format('truetype');
	font-weight: 500;
	font-style: normal;
}
имя у шрифта одно, а вот жирность разная. При этом лучше не забывать о разных браузерах а также о том,что шрифты могут быть в системе пользователя(в этом случае ничего грузиться не будет). В целом, формат .eot - это атавизм для IE, но до сих пор лежит в готовых паках до кучи.

Худший ответ: Вставлю 5 копеек - подключай логотип, как изображение
Вопрос: Документы необходимые для трудоустройства удаленно?

Лучший ответ: Вариантов вообще вступить в отношения с работодателем всего два - обычный трудовой договр и договор ГПХ. Удалённую работу по первому регламентирует ТК РФ. Второй вообще не накладывает никаких ограничений на формат работы. Какие документы нужны - зависит от того, кем вы будете работать и где. Как минимум, кроме паспорта, вам понадобится документ подтверждающий законность пребывания на территории страны. Судя по тегу "Карьера в ИТ", кадры скорее всего поинтересуются документами об образовании.

Худший ответ: Теже самые что и при оффлайн работе, по любым договорам можно выбрать удаленно, кадровик вам вышлет памятку что необходимо
Вопрос: Задача. Скачать файлы(robot.txt и sitemap.xml) с сайтов которые находятся в файле site_base.txt, как пройти по всем значениям?

Лучший ответ: Оставляя в стороне шероховатости, надо то, что после for line in f:, превратить в функцию, которая принимает line и filename(который либо “robot” либо “sitemap”), естественно, подставляя line и filename куда надо в коде, а в остальном функция должна практически повторять всё, что в коде. Ну и вызывать эту функцию дважды для каждого line, подставляя то robot то sitemap.

Худший ответ: Как-то так? Возможно несколько переусложнено и нет проверки на статускод (сами допишите, если надо), но оно работает
# site_base.txt
https://xakep.ru
https://habr.com
https://vc.ru

# [file_name].py
import requests
import os
def append_filename(url:str, filename:str) ->tuple:
    domain = url.split('//')[-1] 
    data = (domain,  url + '/' + filename)
    return data


def save_file_to_disk(filename:str):
    if not os.path.exists('files'): os.mkdir('files')
    with open('site_base.txt', 'r', encoding='UTF-8') as site_base:
        sites_list = site_base.read().split('\n')

    urls_list = [append_filename(url, filename) for url in sites_list]
    for url in urls_list:
        try:
            domain = url[0]
            requested_url = url[1]

            response = requests.get(requested_url)

            saved_filename = domain+'_'+filename
            file_path = os.path.join('files',saved_filename)

            with open(file_path, 'a', encoding='UTF-8') as robots:
                robots.write(response.text)
        except requests.exceptions.RequestException as e:
            print(e) 

save_file_to_disk('robots.txt')
save_file_to_disk('sitemap.xml')
Вопрос: Договорился на подработку, прислали договор на подписание, в нём увидел пункты которые не видел в других подобных договорах — это мошенники?

Лучший ответ: Договорился на подработку, прислали договор на подписание, в нём увидел пункты которые не видел в других подобных договорах - это мошенники, кто ни будь с таким сталкивался?Мошенники вряд ли, но многие заказчики не знают НПА и пишут всё подряд в догор, которые суд часто может признать незаконными. и потребовать возмеще-ния
убытков в виде обоснованного, документально подтвержденного, ущерба.Ну пусть требует). За такие вещи не так легко взыскать. Если что потраченные деньги на разработку системы будет тяжело  класифицировать как ущерб.
Вообще заказчик может отказаться от исполнения договора с этим условием, но если захотят кинуть и сумма не очень большая, то непонятно, что лучше судиться или забить. В целом не совсем уверен в законности этих пунктов, выглядят примерно как пункты типа "заказчик имеет право оштрафовать по договору на 10кк рублей, если будет нарушено НДА", но в реальности он сможет взыскать деньги через суд и то если он правильно всё сделал, если кратко то по нда очень тяжело привлечь. В данном случае работайте либо по предоплате, либо по пунктам, т.е. что-то сделали просите оплату, не дают то прекращаете работу. 
P.S. А что вы делаете, всё что писал выше в основном к разработке относится.

Худший ответ: Мне кажется, если в договоре хоть что-то не устраивает, надо (на выбор):
- предлагать свой вариант;
- просто сваливать;
- просить аванс в таком размере, который тебя устроит как плата за всю работу, т.е. если остаток тебе не заплатят.
Вопрос: Импорт/экспорт товаров на сайт ModX?

Лучший ответ: Я так понял у вас Revo, для него есть как минимум 2 платных компонента в modstore: 
GoogleSheets - Импорт и экспорт товаров / ресурсов / заказов / пользователей (довольно медленный, и есть заморочки с настройками) - мне он как то не особо зашёл, но у него преимущество что работает практически со всеми типами ресурсов.
msImportExport - Импорт и экспорт для miniShop2 (вот этот компонент клевый, если сайт на Minishop2)
И вот бесплатный в репозитории modx: importX (работает с .csv)

Худший ответ: Как альтернатива  - я загружал товары кастомных сниппетом, предварительно превращая .xls файл в .csv, который удобно быстро разобрать в php. Если нужен будет скрипт -поищу
Вопрос: Как удалить русские буквы в текстовом файле?

Лучший ответ: Только русские? А что насчёт иероглифов? Или речь о всех символах, не входящих в ASCII?
В первом случае:
import re
s = "privet брат"
s1 = re.sub('[а-яё]', '', s, flags=re.I)
Во-втором случае:
s1 = s.encode('ascii', errors='ignore').decode('ascii')

Худший ответ: import re

string = 'privet брат!'

cleaned_string = re.sub(r'[ЁёА-я]', '', string)
# 'privet !'
Вопрос: Как настроить vpn WireGuard на роутере Keenetic Start?

Лучший ответ: Варианта 2. Что то блокирует ВПН на вашем кинетике... там есть пакет который позволяет проброс ВПН тунелей, в списке пакетом в меню "система"

Этот ВПН блокирует Ваш провайдер

Проверить как вариант можно подрубив ноут напрямую к провайдеру, минуя роутер

Худший ответ: Сделайте трассировку на VPN-сервер с домашнего Wi-Fi и с мобильного интернета и сразу станет ясно где блокируется.
Вопрос: Зачем нужно DTO в простых сервлетах?

Лучший ответ: Смотрите, entity в базе данных может содержать гораздо больше полей и объектов, чем Вы хотите передать на верх, или получить в виде формы.
Как пример, вывод информации о пользователе. В entity скорее всего будут содержаться поля о хеше пароля, аклах (ACLs), дополнительных связях с другими объектами. На верх же, скорее всего эту информацию передавать не стоит, это внутренняя кухня вашего приложения. Для этого и создают DTO (data transfer object), в котором присутствует ровно то, что нужно передать. И да, нужно делать мерджинг или инкапсуляцию между entity и dto каждый раз туда и обратно. С одной стороны - лишние действия и преобразования из объектов в объекты, в другой - гарантия безопасности и разделение логики хранения и логики передачи сущностей.
Нужно ли это конкретно в вашем приложении - не скажет никто, кроме Вас. Но, хорошая практика - делать dto на каждый случай.

Худший ответ: Добрый день.
DTO - data transfer object это шаблон проектирования.
Варианты использования:
Из клиента прибегает DTO. После чего он маппита в Entity и сохраняется / обновляется в БД.
Либо наоборот из БД вы маппите ваши сущности в DTO и отдаете их в нужном виде.
Это позволяет обезопасить приложение путем создания доп. прослойки. также вы можете отдавать на клиент только нужную для него информацию, а не всю сущность со всеми зависимостями и т.д.
Также на уровне DTO вы можете провести доп. валидацию отправленных от клиента данных.
Вопрос: Где искать работу Junior'ом?

Лучший ответ: давайте я вам открою маленький секрет: под лежачий камень вода не течет. 

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

в моей карьере есть три места работы, куда я попал вообще без открытых у них вакансий. прост пришел к ним и сказал: "я вот такой классный, хочу работать у вас". они конеш охренели, но через месяц и несколько собеседований я уже был у них в штате.

ну и не забывайте: айти, в отличие от многих других областей, не привязано (тем более сейчас) к конкретному месту. поэтому нет смысла циклиться только на своем регионе.

однако, есть два момента, которые нужно знать и понимать:
1. джун - это УЖЕ специалист, хоть и неопытный. а не неумеха. 
2. всегда будет какой-то зумингер, который всё обосрет.

Худший ответ: Так поменяй город в настройках хх
Вопрос: Что значит после класса?

Лучший ответ: Параметризация типа. Учебник читать не пробовали?

Худший ответ: Шаблонный класс.
Гугли «Java Generics»

String — Input parameter type
Integer — progress report type
String — result parameter type
Вопрос: Как сделать так чтобы доступ к backend api был запрещен?

Лучший ответ: Конечно можно, нужно отключить бэкенд. Тогда и доступа не будет

Худший ответ: попробуйте graphql, он запутаней))
для доступа к апи выдают токен при авторизации по логину\паролю + CORS + rate limit

не понятна задача прятанья апишки...
Вопрос: Как посмотреть, сколько памяти потребляет программа в linux?

Лучший ответ: smem --processfilter="[f]irefox" -t
--processfilter="[f]irefox" - отфильтрует нужные процессы
-t - выведет сумму по отфильтрованным

Худший ответ: Строго говоря - никак, учитывая shared memory и кэш. И ваш btop, кстати, скорее всего тоже неправду показывает.
Вопрос: У какого десктопного Linux минимальные требования к RAM?

Лучший ответ: Много ответов, но все чушь. Вас не интересует линукс, вам нужны приложения. Ой, хром 4Гб отожрал, ой IDE 2Гб требует. 

И что? Помогло вам, что на линуксе 50МБ сэкономили?

Худший ответ: Стол раб lxde. 
И или убунту или дебиан
Вопрос: Зачем нужны сервисы типа mailgun?

Лучший ответ: именно для безменингитных массовых рассылок они и нужны.
почтовый сервер - не так просто как кажется.

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

молодой (с)

уже есть топики типа такого, и такого, так что со своим - увы

для компании, конечно. не так плохо - есть ресурс на покупку IP и т.п., для простого - сложно
Вопрос: Работа с памятью и гибернация в linux как в windows?

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

1) Зависит от поставленных задач. У меня стоит, я юзаю, нраица. Впрочем, у меня еще и KSM включен и виртуалки крутятся под KVM, и все это на ноуте. Иногда люди в кафешках выворачивют шею, видят как я шпарю в консольке в виме на C++ и не понимают, шоэто (наверное думают, что я - какир, или как там его).
Еще раз - оценить пригодность того или иного инструмента просто так в вакууме без конкретной задачи и критерия оценивания - невозможно и бессмысленно Вы можете сформулировать ваше хорошо работает?

2) Он и так жмет, а потом разжимает. Вот смеху-то будет, если своп будет сам по себе заполнен чем-то, а вы туда еще и рам захотите засунуть и она не влезет.
Я бы больше беспокоился обо всяких кривых дровах вроде NVIDIA, которые могут просыпаться через раз или вообще писать GPU has fallen of the bus и все тут

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

Я бы например сказал, что после загрузки тарахтеть диском (в 2020х у кого-то стоит система на блинном диске? Серьезно?) и грузить НА ВСЯКИЙ СЛУЧАЙ фотошоп, который мне не уперся, это так себе занятие.

В целом, берете SSD хоть на 256 гигабайт, ставите туда систему, нарезаете 64 гигабайта под свапник и не кипятите себе мОзги всяким колхозом.

Худший ответ: 1. Сжатая память? Вы уверены? можно документацию где это работает по дефолту?
2. гибернация это не своп. Не путайте pagefile.sys и hiberfil.sys - это совершенно разные и независимые штуки.
Swap на линуксе может быть вообще какой угодно.
3. Это не совсем так работает. С достаточным объемом памяти Линукс сам со всем разбирается. Просто Линукс не то, чтобы привык что его часто ребутают. А если не ребутать, он в принципе старается кешировать все, что может.
Вопрос: Почему при сортировке 1 меньше, чем true?

Лучший ответ: При приведении типов (во время операции вычитания) true приводится к 1. Эти два значения равны, и в результирующем массиве они следуют в том же порядке. что и в исходном. Можете проверить, поменяв true и 1 местами.

Худший ответ: Они равны (в том смысле, что 1-true == 0 и true-1 == 0).
Сортировка в JS, вообще говоря, не stable, так что в отсортированном массиве они могут идти в любом порядке.

[2,5,true,1].sort((a,b) => a-b)
// [true, 1, 2, 5]
Вопрос: Как зависит степень износа микросхем от температуры?

Лучший ответ: Экспоненциально. Чем выше температура, тем больше вероятность отказа и возрастает она всё быстрее и быстрее с повышением температуры.

Тут, в основном, проблема с перегревом - у РЭА всегда есть рекомендуемый температурный режим, который лучше не нарушать и который гарантирует стабильную работу при соблюдении этого режима. Само-собой, если превысите, то вероятность отказа возрастёт.

Если у вас какие-то нестандартные температурные условия работы, то берите сертифицированные для этих условий устройства, те же промышленные ПК, например.

200 градусов - это, конечно, перебор.
spoilerОх, не зря диплом радиотехника получал.

Худший ответ: Не знаю, как у нас время наработки вычисляют. А за рупь-ежом - на основании уравнения Аррениуса (энергия активации, температура и т.п.).
А вкратце - да, сокращается экспоненциально с ростом температуры.
Вопрос: Как работает бинарный оператор & в python?

Лучший ответ: Этот оператор может быть перегружен, а потому имеет разную семантику для разных типов данных.
Для множеств этот оператор возвращает их пересечение.
Ты можешь добавить поддержку этого оператора в свой класс, объявив магический метод __and__().

Худший ответ: Важно понять, что фигурные скобки - литерал множества. Вы сделали два множества и провели операцию & для двух множеств. Результат - множество, содержащее совпавшие элементы из обоих множеств.
В случае, когда вы сделали «число» И «число», у чисел в python способ логического И описан несколько по-другому, и результат другой. 

В общем, вы можете сделать свой тип (класс) множеств, для которого переопределить эту и другие операции как вам хочется. По-умолчанию - так.
Вопрос: Потребление ОЗУ IntelliJ на макбуке с м1 чипом?

Лучший ответ: У меня на винде тожсамое, минимум раз в неделю надо перезагружать.

Худший ответ: У меня стоит ребут 2раза в неделю. Так что наверное норма)
Вопрос: Как доказать клиенту, что не мы сломали сайт?

Лучший ответ: Используйте систему контроля версий (т.е. git). Вы всегда сможете посмотреть изменения, которые были сделаны и не занесены в production.
Полезная команда для вашего случая git diff, которая выводит изменения в файлах, которые еще не были добавлены в индекс. Сравнение происходит с последним коммитом.

Худший ответ: Если только по IP адресам, с которых подключались