Записки разработчика
28 subscribers
22 photos
4 files
131 links
Заметки о используемых инструментах и технологиях, прочитанных статьях и книгах, размышления о саморазвитии и решении прикладных задач.
Download Telegram
Что нужно знать (веб-)разработчику о взаимодействии в сети?
В первую очередь, это немного базовой теории об устройстве сети в целом (очень интересно!)
Основные сетевые термины и сетевые модели
Протоколы верхнего уровня (по желанию, далее подробнее)
Протоколы нижних уровней (транспортного, сетевого и канального)
Понятие IP адресации, масок подсетей и их расчет
И, конечно же, про конкретные протоколы:
# как работает udp и tcp, знать разницу
# знать на отлично http
# хоть раз скачивать файл по ftp
# понимать основы криптографии, а именно алгоритмы:
* Протокол Диффи — Хеллмана
* RSA
* и держать в уме самую частую уязвимость
# конечно, же знать как работает ssl и tls
# везде на своих сайтах использовать https
# ходить только по ssh
# пользоваться websocket
# и полюбить очереди - amqp

Есть клевая статья на английском, как будут работать протоколы ip/tcp/http/https все вместе.
В принципе все покрывается статьями с теорией, но некоторые выводы стоят того, чтобы прочитать.
Приятно чтения)
Недавно начал играть и смотреть игры по StarCraft2. Наткнулся на интересную серию игр ИИ DeepMind против прогеймеров:
https://www.youtube.com/watch?v=FEFxLpv-rZM
И соответствующий анализ игры ИИ.
https://www.youtube.com/watch?v=FFJRd9l6kW4
Довольно интересно понимать, какие игровые приемущества получает DeepMind только за счет того, что это компьтер. Например, невидимые юниты становятся для него не такими уж и невидимыми за счет обычного эффекта блюра.
"Я не боюсь ИИ который пройдет тест Тьюринга, я боюсь ИИ, который его намеренно завалит"
В общем, рекомендую.
Задача от yandex на вакансию "Разработчик беспилотных автомобилей":
Двое игроков играют в игру с карточной колодой.
Игрок А делит стандартную колоду из 52 карт на две стопки карт по своему усмотрению с единственным ограничением: в каждой стопке должна быть хотя бы одна карта.
Игрок Б случайным образом выбирает одну из двух стопок карт (каждую из стопок он может выбрать с одинаковой вероятностью, 50%), после чего вытаскивает одну случайную карту из выбранной стопки.
Как следует действовать игроку А, чтобы максимизировать вероятность вытаскивания игроком Б карты черной масти, и чему будет равна эта вероятность?
Какой минимальной вероятности вытаскивания можно достичь и каким образом? Ответы обоснуйте.

Нужно максимизировать условие:
max(P(A)) = ?
где A - событие вытаскивания игроком карты черной масти.

Выразим эту вероятность через другие:
P(A) = P(A B1) + P(A B2) = P(A|B1) * P(B1) + P(A|B2) * P(B2)
где P(A|Bi) - вероятность вытащить из i колоды черную карты
P(Bi) - вероятность выбрать i-ую колоду

P(A|Bi) = bi/(bi + ri)
где bi - количество черных карт
ri - количество красных карт

Сумма, очевидно, черных и красных карт должна быть равна 52.
Для нашего случая получаем:
P(A|B1) = b1/(b1 + r1)
P(A|B2) = (26-b1)/(52 - b1 - r1)
P(A) = (b1/(b1 + r1) + (26-b1)/(52 - b1 - r1))/2

Максимум достигается при b1 = 1, r1 = 0. Вот тут хз как доказать, вроде очевидно.
Тогда в первой колоде всего 1 черная карта (вероятность вытянуть черную карту 100%),
а в другой 25 черных карт и 26 красных (вероятность 48%)
P(A) = (1/(1 + 0) + (26-1)/(52 - 1 - 0))/2= (1 + 25/52)/2 ~ 74%
Если хотим минимизировать, очевидно, вероятность 26%.
Показательный пример (по мотивам статьи):
Человек, очень сильно интересующийся парсером питона, создал патч, который уменьшает потребление памяти парсера на 30%. Очень клево, да? Правда, изменений очень много.
Но за полгода этот патч никто так и не поревьювил. А в конце еще и Гвидо ван Россум резюмировал:
"Python's parser wasn't designed to *efficiently* parse huge data tables like that, and if you have that much data, using JSON is the right answer.... Sometimes a change is just not worth the effort."
Мне кажется отличный пример прагматичности, так иногда мы делаем кучу больших, опасных изменений, которые не двигают проект вперед, а служат скорее некой ачивкой для разработчика.
Очень часто в проектах вижу использование оператора:
x &= y
Все бы хорошо, но почти везде его используют для операндов с типом bool. Cкорей всего лень писать:
x = x && y, а оператора x &&= y, как известно,
в С++ нет, поэтому делают такой "хак".
Но нужно понимать. что замена не релевантная и при смене типа у x или y - команда будет работать не так, как вы ожидаете.
Неожиданно осознал, что в нашем проекте практически никто не использует namedtuple, а это чертовски удобная вещь и часто помогает значительно сократить объем копипасты!
Немного про стремные хаки, которые работают:
В проекте dava.engine, в классе файла под андроидом есть код, который 10 раз подряд пытается открыть файл и засыпает на 100 милисекунд, если открыть не получилось. Казалось бы, зачем? Этот код появился после фикса бага в DLC - только что скаченный файл при попытки открытия был недоступен. Эмпирически вывели, что после 8 попыток файл гарантированно открывался. Вот и вставили 10 (на всякий случай!) попыток на открытие.
Стоит отметить, что есть похожий хак в коде хромиума - попытка удаления файла два раза подряд.
К сожалению, наш мир не идеален и нужно понимать, что на файлы - это внешняя среда по отношению к программе, и с этой средой может твориться все что угодно - файлы могут быть использованы другими процессами (вирусы, антивирусы, системы контроля версий и прочие сканеры), баги по работе с файлами в других приложениях и же даже нас может подвести оборудование.
Если с кодом в хромиуме это выглядит как простое решение достаточно сложной проблемы, то в коде dava.engine это грязный хак. Проблема, очевидно, есть и с ней стоило бы разобраться. Почему временная задержка помогает? Может сообщение о завершении скачки файла пришло раньше, чем оно на самом деле произошло? Файловые дескрипторы закончились? Сторонние процессы лочат доступ? К сожалению, узнать это будет уже сложно. Код ведь работает, а если работает - не трожь. 🙂
Как в астраномии ведется обмен знанием о событиях взрыва сверхновых, гравитационных волнах и прочее? Мне казалось, что это некие пресс релизы с кучей excel файлов, которые рассылаются по почте. А если что-то срочное - то звонят по телефону или даже скайпу. Не знаю с чем связано такое глупое заблуждение, но я был рад узнать о International Virtual Observatory Alliance.
Смысл этого сообщества в создании "виртуальной обсерватории" для своевременного обмена астрономическими событиями. Эти события имеют описываются в определенном формате - VOEvent (в xml =). Для обмена есть свой собственный протокол поверх TCP/IP VOEvent Transport Protocol. Соответственно, для всего этого есть проект на github.
Зачем это? И что это дает?
Да все просто - обсерватории мира объединены в одну сеть и если какая-либо обсерватория регистрирует событие о, к примеру, гравитационных волнах, то можно автоматически навести телескоп на предполагаемый участок неба и в реальном времени снять другие параметры этого события.
Есть так же и специализированные проекты - для получения сообщений конкретно о гамма-всплесках. Без проблем получилось запустить, посмотрим, сколько нотификаций о событиях я получу =) UPD. За 15 минут - 3 события.
Принцип работы алгоритма Код Хаффмана. Используется в архиваторах, изображениях и при передаче данных по HTTP.
Алгоритм простой, и, как по мне, потрясающе красивый, поэтому обязателен к ознакомлению.
Ловушка для беспилотного автомобиля :)
https://github.com/kamranahmedse/developer-roadmap
Ветка развития fronend, backend, devops специалиста в картинках) Оргиниальный способ, нужно сказать, так как каждый желающий может выразить свое пожелание создав Issue или pr c фиксом, коих там много)
Запилил тут недавно пакет для питона, подробнее в статье:
https://telegra.ph/Idealnyj-proekt-paketa-s-podderzhkoj-raznyh-versij-pitona-04-24
Очень бесит в поисковой выдаче qaru.site, который по факту является автоматически переведенными ответами со stackoverflow.com.
Благо добрые люди написали блокировщики поисковой выдачи. Сначала попробовал блокировщик от гугла, но оказалось что он уже мертв). Но нашелся более удачный вариат Google Hit Hider, который работает, кстати, не только для гугл поиска.
Советую скачать Violentmonkey (потому что он опен сорсный) и установить непосредственно скрипт для блокировки.
И все работает отлично!
Duff's device - пример извращения, которое так любят создавать программисты.
register n = (count + 7) / 8;      /* count > 0 assumed */

switch (count % 😍
{
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}

Это раскрутка цикла вкупе с необычной возможность языка С - сквозная конструкция do{}while.
И именно это необычное свойство позволяет создать облегченный потоки на голом языке C.
Можно почитать статью Операционная система из говна и палок, там описан подход с указанием всех источников.
Есть кучу реально крутых проектов, которые меняют мир к лучшему.
А есть fartscroll.js 🙂