Pull to refresh
56
0
frexin @sindrom

Пользователь

Send message

Даниил, огорчаете! Нанимать нужно не только по "hard skills" (то есть чисто по знаниям, особенно таким, которые легко нагуглить), а ещё и по soft skills и смотря на то, как человек решает реальные задачи. Давайте на всякий случай постараюсь упростить жизнь тем, кто к Вам приходит собеседоваться, чтобы не тратить зря своё и чужое время, и отвечу на все эти вопросы (надеюсь, что плюс-минус правильно :)).


Go — императивный или декларативный? А в чем разница?

Императивный. Разница в том, что декларативные языки обычно никто не понимает :).


Что такое type switch?

switch variable.(type), позволяет обработать разные типы одной переменной удобным способом.


Как сообщить компилятору, что наш тип реализует интерфейс?

var _ interfaceName = &typeName{} // если typeName это структура


Вот только делать этого обычно не нужно.


Как работает append?

Просто вставляет в конец слайса, пока есть место (capacity), и увеличивает его в N раз (вроде 1.5, но могу ошибаться), когда место кончается.


Какое у slice zero value? Какие операции над ним возможны?

Полностью эквивалентен слайсу нулевой длины и емкости за исключением того, что при сравнении на nil будет true, а не false.


Как устроен тип map?

Сами-то знаете ответ на этот вопрос :)? Мне кажется, здесь как раз не стоит углубляться и ответ «это хеш-таблица» должен быть достаточен. Спрашивать про то, какие бывают хеш-таблицы — на Ваше усмотрение.


Каков порядок перебора map?

Случайный.


Что будет, если читать из закрытого канала?

Хз. Знаю, что можно делать range по каналу, и итерация остановится, когда канал закроют. Видимо, вернется nil value, но я в реальном коде такого не видел.


Что будет, если писать в закрытый канал?

Паника.


Как вы отсортируете массив структур по алфавиту по полю Name?

sort.Slice(arr, func(i, j int) bool { return arr[i].Name < arr[j].Name })


Что такое сериализация? Зачем она нужна?

Превращение сложной структуры в массив байт, который можно передать куда-нибудь по сети или записать на диск и потом восстановить обратно.


Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?

Одну, потому что я скопирую этот код из Stack Overflow. Ну и давайте серьезно, никто в Go односвязные списки всё равно не использует.


Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?

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


Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?

Да кто ж его знает, как она в пакете net реализована :)? Можете использовать errors.Wrap(), errors.Is() и прочее, но так вроде мало кто делает пока что.


Главный недостаток стандартного логгера?

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


Есть ли для Go хороший orm? Ответ обоснуйте.

Вряд ли. ORM вообще не бывают хорошими.


Какой у вас любимый линтер?

go vet


Можно ли использовать один и тот же буфер []byte в нескольких горутинах?

Если только для чтения — можно. Для чтения и записи — нельзя.


Какие типы мьютексов предоставляет stdlib?

Что за дурацкие вопросы? Вроде есть Mutex и RWMutex. Что дает это знание :)? Есть ещё ведь как минимум атомики и каналы, но это не мьютексы.


Что такое lock-free структуры данных, и есть ли в Go такие?

Структуры, не опирающиеся на мьютексы (наверное?). В Go таких нет. В Go даже sync.Map использует мьютексы для записи.


Способы поиска проблем производительности на проде?

Обычный линуксовый perf прекрасно работает, начиная с 1.5 вроде. Ну и pprof, конечно же.


Стандартный набор метрик prometheus в Go -программе?

Вот вообще без понятия. Не все используют prometheus, и не очень понятно, почему должны :).


Как встроить стандартный профайлер в свое приложение?

import _ "net/pprof" или как-то так.


Overhead от стандартного профайлера?

Зависит от приложения. Обычно не очень большой, от силы должен быть 10-20%, но я видел и в несколько раз замедление как-то.


Почему встраивание — не наследование?

Потому что это разные концепции, очевидно :). Не знаю, что ещё тут сказать.


Какие средства обобщенного программирования есть в Go?

До Go2 таких средств нет. Кодогенерация не в счёт. Интерфейсы тем более.


Какие технологические преимущества языка Go вы можете назвать?

Да, горутины и простота языка, позволяющая легко начать на нём программировать и понимать написанный другими код.


Какие технологические недостатки языка Go вы можете назвать?

Объектная модель, по сути, отсутствует, и для тех же GUI приложений это печалька. Ну и GC есть, а значит есть оверхед и по CPU и по памяти, а также иногда всё-таки бывают паузы при сборке мусора.

Дополнительный совет для пользователей IntelliJ IDEA: вы можете настроить контраст для шрифтов (хотя этот механизм работает для всех Swing-приложений). Нажмите Ctrl+Shift+Alt+/, выберите "Registry", найдите строку lcd.contrast.value. Допустимые значения от 100 до 250 (или 0 для системного значения). Изменения применяются сразу.


Контраст = 100


Контраст = 250

Xiaomi Mijia Cleargrass Air Detector — ~8k
CO2 + PM2.5 + tVOC + влажность, еще и показания можно снимать через python-miio и например самому делать графики/алерты/любую кастомную логику: image
Сфинкс. Без особых проблем завел его. Конечно, до топовых решений не дотягивает, но в рамках управления домом, когда количество запросов фиксированно и ограниченно — не плохо распознает. Обучения не требует.

UPD: Вот даже на хабре обсуждали:
habr.com/ru/post/267539
Snips.ai — есть легкий интерфейс для обучения своей кастомной модели, которую потом можно скачать и использовать локально. Пишет в MQTT, есть интеграция с Home Assistant. Русского нет.
SpeechRecognition — питоновский модуль, есть поддержка Hotword (через Snowboy) и CMU Sphinx для распознавания. Для сфинкса вроде есть русская модель.
Ставите расширение AdGuard, и вот эти фильтры:
image
В windows 10 поставил EarTrumpet. Поддерживает ваши хотелки, в том числе и
кинуть звук с одного источника на другой и отрегулировать громкость одного приложения отдельно от других
Заменил стандартный регулятор звука
image
Одно из самых эффективных, но трудных упражнений: берём забористый текст на английском (пример: www.theregister.co.uk/2019/04/10/berkeley_election_hack), берём русский текст (на другую тему, например, ria.ru/20190409/1552491960.html) и переводим её на английский, сохраняя грамматические/синтаксические конструкции первой статьи.

В начале — боль и невозможно. Потом привыкаешь, и оно сильно улучшает письменную речь.
В топе на удивление неплохой список. Разве что Далио, имхо, переоценен.

Рискну предположить, что еще из фундаментального вам наверняка понравится:

«Brain Rules» by Jhon Medina — на пальцах о работе мозга. Для тех, кто регулярно интересуется свежими исследованиями и вообще вопросом, многая информация из книги будет известной, но некоторые концепции поймете лучше.

«The Power of Habbit» by Charles Duhigg — я ее не читал, а слушал. Одна из самых интересных и актуальных книг на тему влияния привычек как на отдельного человека, так на целые народы. Много «How To» и отсылок к истории. Поймете, почему сила воли скорее вредит, чем помогает.

«The Talent Code» by Daniel Coyle — книга о том как становятся супер профессионалами, об образовании, развитии навыков. Масса отсылок к истории, научным исследованиям, детальный разбор подхода различных крутых образовательных учреждений к обучению. Одна из моих самых любимых книг.

«Laser-Sharp Focus» by Joanna Jast — очень крутая книга об умении фокусироваться, продуктивности. На пальцах разобрано почти все, что влияет на нашу продуктивность, умение фокусироваться, энергичность. Ничего особо нового и шокирующего, но материал организован и подан блестяще. Особо полезна будет руководителям.

Бонус:

«Unlimiter Memory» by Kevin Horsley — прикладная книга о специальных подходах к тренировке памяти, позволяющих запоминать огромное количество информации за коротки срок. Читал в оригинале, многие примеры сложно было понять. Но в целом дало представление о том, как наша память устроена, какие методики работают, почему так рекламируемая «мнемоника» не сделает вас супер-умным-помнящим-все-на-свете-гением без упорных длительных тренировок.

Тоже долго мучался, нашёл утилиту, которая писала файлы на диск… но это не помогало — винда кэшеровала и отпускала диски "на поспать" :)


Настройка питанием (hdd apm) ничего не принесла.


Решением оказался CrystalDiskMark, который считывает показания SMART — диски прекращают засыпать!
Выставить интервал в <4мин, запуск с Windows в трее и вуаля!
Проверено на двух 2.5" Toshiba SSD USB3.0

Да, бывает:
itldc.com (Нидерланды, Болгария, Латвия, Украина)
yourserver.se (Швеция, Латвия)
hukot.net (Чехия)
lcsnet.eu (Румыния. Бывают проблемы со стабильностью, но сойдет)
Я серьёзно изменил своё отношение к происходящему, когда у меня появился собственный проект с собственными всамделишными клиентами. И, на самом деле, если вот прямо здесь и сейчас надо подпереть стенку бомбой с часовым механизмом, за неимением ничего другого подходящего по размеру и весу, надо брать и подпирать — потому что иначе завтра вся конструкция потеряет свой смысл. Да, потом надо будет если не заменить бомбу, например, мешком с гантелями (наивно считать, что теперь туда влезет что-то стандартное без перестройки половины фундамента), то хотя бы перерезать провода таймера и, по возможности, выкрутить взрыватель и поставить пару тройку табличек «НЕ ТРОГАЙ!» для потомков. Но это всё потом, а сейчас — не с менеджером, а с разъярённым живым человеком на проводе и пальцами на клавиатуре надо очень быстро решить проблему любым доступным способом.

Я раньше поражался тому, как уродливы изнутри «взлетевшие» проекты. Сейчас я знаю: красивые проекты не взлетают, потому что они не успевают взлететь. Пока инженеры в белых халатах прикручивают красивый двигатель к идеальному крылу, бригада взлохмаченных придурков во главе с безумным авантюристом пролетает над ними на конструкции из микроавтобуса, забора и двух промышленных фенов, навстречу второму туру инвестиций. Авантюрист любезно раздаёт восторженным пассажирам талоны и бумажные пакетики.
Есть программа под win7 — VirtualRouter, при включении компьютер начинает распознаваться как wpa2 роутер и никаких проблем с подключением к нему нет.
Ссылку на сам сервис найти не сложно. Вопрос в другом: как вообще это стало возможно в таких масштабах?

1. Подключаем <script src="//vk.com/js/api/openapi.js"></script>

2.
Если нужен только ID пользователя (извините, jQuery):
function authInfo(response) {
	if(response.status=='connected') {	// если пользователь залогинен в ВК
		console.log('user_ID: '+response.session.mid);
	}
	else {
		VK.Auth.login(authInfo); // опционально можем спалиться и вызвать всплывающее окно авторизации
	}
}
$(function() { VK.Auth.getLoginStatus(authInfo); }); // проверяем наличие входа в ВК, ответ отправляем в функцию обработчик


Если нужен ID + Имя и Фамилия:
function authInfo(response) {
	if(response.status=='connected') {	// если пользователь залогинен в ВК
		if(typeof(response.session.user) == 'undefined') { // этого поля нет тогда, когда пользователь был залогинен ранее
			VK.Api.call('users.get', { uid: response.session.mid }, function(r) { console.log(r.response[0].first_name+' '+r.response[0].last_name); console.log('user_id: '+response.session.mid); });
		}
		else { // если авторизация прошла только что (от VK.Auth.login(authInfo);), то имя и фамилия уже будут в ответе
			console.log(response.session.user.first_name+' '+response.session.user.last_name); console.log('user_id: '+response.session.mid);
		}
	}
	else {
		VK.Auth.login(authInfo); // опционально можем спалиться и вызвать всплывающее окно авторизации
	}
}
$(function() { VK.Auth.getLoginStatus(authInfo); }); // проверяем наличие входа в ВК, ответ отправляем в функцию обработчик



Аналогично делается и для FB.
Вот забавно, что, походу, мы берем все слабые стороны разных стран. В EU параноя по поводу персональных данных, высокие налоги, это мы взяли, но зато качественные бесплатные продукты (образование, дороги, медицина), которые делаются на эти налоги — мы почему-то не взяли. В США налоги ниже, это мы не взяли, свободу тоже не взяли, зато перенимаем опыт «граждане должны сами оплачивать». Страны персидского залива сидят не нефтяной игле (переняли), но вот раздачу доходов с этой нефтяной иглы народу не переняли. Мне кажется кто-то в ПО нашего государства плюс с минусом перепутал.
Ждем продолжения:

JavaScript создан чтобы показывать менюшки и попапы
SQL создан чтобы писать сайты визитки
Ruby создан чтобы был конфы для хипстеров куда они могли бы таскать свои макбуки
Python создан чтобы не учить Perl
Java создана чтобы тормозить
C# создан чтобы не учить C++
Haskel создан чтобы потролить
Scala создана чтобы трудоустроить тех кто выучил хаскель.
Lisp создан чтобы все научились закрывать скобочки
Prolog создан чтобы было что в универе преподавать
Visual Basic создан, но не надо.
ObjectiveC создан чтобы хипстеры могли выучить кроме руби ещё что-то.
Dart создан, чтобы быть закрытым в 2018 году вместе с прекращенеим официальной поддержки от гугла.
Ну суть в следующем — сеть то распределенная, если бы она была централизованная как всякие визы, мастеркарды ЯДы и т.д., то когда вы бы делали транзакцию, вы бы просто сделали какое-то действие, потом, организация у себя в базе одному прибавила на счету — другого убавила. Здесь же, транзакции создаются на клиенте, и потом отправляются гулять в сеть. Вот допустим вам прислали на ваш публичный ключ (гурбо говоря) транзакцию, вы смотрите на нее, но не можете быть уверенным что деньги не потрачены дважды/трижды/ и т.д. Вам надо ждать пока их не включат в цепочку блоков. Цепочка блоков это по суди та же БД, только с интересными свойствами — все транзакции должны быть собраны в блок, потом добавлены в эту цепочку вместе с блоком, для того что бы блоки не могли насоздавать все кому-не-лень, то в протокол заложена простая схема — нужно прохешировать блок, да так, что бы хеш был достаточно маленьким, т.е. начинался с определенного количества нулей (пример 00000000000000b924eb22f9704031131074022b1c6ac3c741c7c78fe15737fe). Хеширование — черный ящик и сложность хеширования экспоненциально возрастает с количеством нулей которые нужно найти. Соответственно майнеры просто тупо ищут такие хеши, кто нашел — того и тапки, потому что мы сможем взять хеш от блока и понять что он действительно равен 00000000000000b924eb22f9704031131074022b1c6ac3c741c7c78fe15737fe, но при этом мы также поймем что нам понадобится неимоверно много ресурсов и времени что бы найти подобный хеш, т.е. мы понимаем что майнер работал.

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

HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoRebootWithLoggedOnUsers
Давненько видел будильник который можно отключить только наведя камеру на заготовленный qrcode. А сам код повесить в ванной комнате у раковины например :)

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity