Pull to refresh
1
0
Send message

4 месяца борьбы за место DS джуна (перекатиться в 37 лет)

Reading time6 min
Views33K

Делюсь собственным опытом, т.к., наверняка, это будет интересно таким же как я, но может и не только.

Заранее предупрежу, многие термины и сокращения будут понятны только тем, кто имеет базовые знания и какой-то опыт в Data Science и Машинном обучении.

Итак, в наличии на август 2020:

Читать далее

Так ли токсичен синтаксис Rust?

Reading time19 min
Views51K
fn main() {
  println!("Hello, Rust!");
  println!("... Goodbye!");
}

Синтаксис — это первое, на что обращают внимание разработчики, впервые столкнувшись с кодом на Rust. И сложно найти что-то другое, что вызывало бы больше негодования у новичков, и при этом такое, к чему совершенно спокойно относятся уже "понюхавшие пороха" Rust-программисты. Посмотрите, например, сколько эмоций вызывает синтаксис Rust у комментаторов одной из типичных новостей про Rust на OpenNET:

Читать дальше →

Новости Yii 2020, выпуск 8

Reading time6 min
Views4K

Всем привет! Это последний выпуск новостей в "весёлом" 2020 году. Я едва успел его приготовить потому как скорость разработки Yii 3 сильно подросла. Все пакеты в этом месяце мы тегнуть не успели, но многие почти готовы, поэтому стоит ожидать релизов в Январе.


С наступающим Новым Годом! Пусть будет менее сумасшедшим, чем 2020. — Александр Макаров


// Не забывайте ставить звёздочки любимым пакетам на GitHub.

Читать дальше →

Splay-дерево. Поиск

Reading time13 min
Views11K

Наихудшая временная сложность таких операций, как поиск, удаление и вставка, для двоичного дерева поиска (Binary Search Tree) составляет O(n). Наихудший случай случай возникает, когда дерево несбалансировано. Мы можем улучшить наихудший результат временной сложности до O(log n) с помощью красно-черных и АВЛ-деревьев.

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

Подобно красно-черным и АВЛ-деревьям, Splay-дерево (или косое дерево) также является самобалансирующимся бинарным деревом поиска. Основная идея splay-дерева состоит в том, чтобы помещать элемент, к которому недавно осуществлялся доступ, в корень дерева, что делает этот элемент, доступным за время порядка O(1) при повторном доступе. Вся суть заключается в том, чтобы использовать концепцию локальности ссылок (в среднестатистическом приложении 80% обращений приходятся на 20% элементов). Представьте себе ситуацию, когда у нас есть миллионы или даже миллиарды ключей, и лишь к некоторым из них обращаются регулярно, что весьма вероятно для многих типичных приложениях.

Читать далее

@Transactional в Spring под капотом

Reading time16 min
Views216K

Spring предоставляет много удобств и многие его возможности кажутся магией - поставил аннотацию и все работает. Но, когда что-то идет не так (например, почему-то не работают транзакции как ожидается), приходится лезть внутрь и смотреть, где сломалось. В статье показан путь от создания инфраструктуры для обработки Transactional до обработки исключений.

Читать далее

Сколько нужно примитивов для реализации форт системы?

Reading time3 min
Views5.1K
В 1992-м году проходил очередной конкурс по обфусцированному программированию на языке С. Один из представленных проектов был небольшой форт системой. Меня поразило, что виртуальная машина была реализована всего в 794 байтах С кода. Остальная часть форт системы загружалась из исходника на форте. После изучения проекта первоначальный восторг уступил место разочарованию, так как автор использовал не совсем “честный” трюк: для парсинга фортового исходника он использовал функцию scanf(). С этого момента меня терзал вопрос — сколько нужно примитивов для реализации форт системы без подобных трюков?
Читать дальше →

Опрос: разговор о повышении зарплаты — с готовым оффером или без?

Reading time1 min
Views18K

В обсуждении статьи Milfgard-а о системе повышения зарплаты у нас с VolCh возник спор о том, как правильно это делать: с готовым оффером от другого работодателя в качестве аргумента или просто настаивать и быть готовым уйти, если не повысят.

Читать дальше →

Самая хитрая защита флоппи-дисков

Reading time13 min
Views14K

Введение


Недавно я затеял одиссею по изучению защит гибких дисков

В своих предыдущих постах я уже рассказывал (напрямую или косвенно) о примерах интересных схем защиты гибких дисков:

  • Слабые биты. [ссылка: Weak bits floppy disc protection: an alternate origins story on 8-bit]. Защита «слабыми битами» реализуется так: часть поверхности диска оставляется пустой изменений потоков намагниченности. В условиях отсутствия сигнала привод гибких дисков повышает коэффициент усиления своего усилителя и видит шум, проявляющий себя как недетерминированные цифровые сигналы с диска.
  • Нечёткие биты. [ссылка: Technical Documentation — Dungeon Master and Chaos Strikes Back — Detailed analysis of Atari ST Floppy Disks]. При защите «нечёткими битами» изменения потоков намагниченности записываются с интервалами, отличающимися по времени от спецификации (например, MFM). Благодаря использованию интервалов прямо посередине пары ожидаемых значений (например, 5 мкс вместо ожидаемых 4 мкс или 6 мкс) можно заставить контроллер дисков возвращать недетерминированные цифровые сигналы.
  • Длинные/короткие дорожки. [ссылка: Turning a £400 BBC Micro (1981) into a $40,000 disc writer (1987)] [см. раздел «Capabilities Unlocked»] [Перевод статьи на Хабре]. При защите длинными дорожками запись переходов намагниченности выполняется чуть быстрее, чем обычно. Это может быть целая дорожка или только её часть. В любом случае, будет казаться, что дорожка содержит больше байтов, чем обычно должно быть в дорожке. Такая защита работает, потому что у контроллера гибких дисков обычно есть широкий допуск на битрейт, чтобы учитывать тот факт, что дисковые приводы естественным образом крутятся на разных скоростях.

В этой статье мы рассмотрим совершенно иную защиту, обладающую уникальными особенностями, которая мне кажется довольно изобретательной.
Читать дальше →

Первый парсер на деревне

Reading time7 min
Views6K
Сегодня мы померяемся парсерами. Точнее, померяем эффективность разных вариантов JavaScript-парсеров на примере одной простой задачи преобразования строки конкретного формата в объект.


Вопросы сложностей организации многопоточности в JavaScript оставим за рамками этой статьи и сосредоточимся на различных вариантах и малоизвестных способах использования регулярных выражений для разбора строки buffers-атрибута узла плана PostgreSQL.

То есть из строки вида 'Buffers: shared hit=123 read=456, local hit=789' мы хотим как можно быстрее получить JSON такого формата:

{
  "shared-hit"  : 123
, "shared-read" : 456
, "local-hit"   : 789
}

Выглядит вроде все тривиально, правда же?

Читать дальше →

Дайте две или уязвимость защиты многостраничных PIC18

Reading time4 min
Views13K

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

Читать далее

Зловредное «Недопустимое значение DataGridViewComboBoxCell» в vb.net и c#

Reading time2 min
Views4K
Привет всем, программирующим окошки под MS VS.

Проблема


1. Есть DataGridView, один из столбцов — DataGridViewComboBoxColumn;
2. Данные в грид закидываются через DataSource, как DataTable (не построчно, это важно);
3. Данные в ComboBoxColumn тоже биндятся, в источнике данных есть заполненный DataMember, построчно или нет — не важно, конкретная структура данных тоже не важна, ValueMember в ней Integer, Long или даже String.

При выборе чего-то из выпадающего списка dgv_DataError ловит ошибку: «Недопустимое значение DataGridViewComboBoxCell». И на заполнении — ее же.
Читать дальше →

Как я пытался улучшить Laravel, а сделал только хуже

Reading time5 min
Views10K

Laravel – классный PHP-фреймворк, мы им постоянно пользуемся в компании. Но как известно, ничто в мире не идеально, можно всегда предложить улучшения.

Несколько недель назад я попытался сделать одно маленькие улучшение по части тестов в Laravel, открыл два пулл-реквеста (#1 и #2). Оба пулл-реквеста были отклонены автором фреймворка Тейлором, но в итоге он сам в этот же день опубликовал собственную реализацию того же функционала, о чём даже в твиттере похвалился. И, о боги, реализацию ужасную!

Читать далее

Стоило ли столько ждать, чтобы найти баг?

Reading time2 min
Views4.4K
image1.png

Наверняка Вы задавались вопросом, чей код качественнее: у проекта с открытым кодом или закрытым? После прочтения нашего блога можно подумать, что все ошибки собрали проекты с открытым исходным кодом. Но это не совсем так. Ошибки есть во всех проектах, независимо от способа их хранения. А качество будет лучше там, где его повышают. Эта небольшая заметка о том, как в одном проекте исправляли баг 2 года, а могли бы сделать это за 5 минут.
Читать дальше →

Ковыряемся в чипе M1 от Apple

Reading time6 min
Views28K
image

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

Apple была достаточно любезна, чтобы опубликовать фотографию кристалла (это еще одна небольшая деталь, которая приблизила компанию к AMD и Intel, поскольку теперь это традиционная стратегия анонса новых процессоров), и они были быстро разобраны супер-компьютерщиками – такими как Андрей Фрумусану из Anandtech.

Мы знаем из самых ранних анонсов, что M1 на базе ARM будет крепким представителем категории SoC.

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

Коды ошибок — это гораздо медленнее, чем исключения

Reading time12 min
Views22K
На современных 64-битных PC-архитектурах использование C++-исключений означает всего лишь добавление к функциям недостижимого кода с вызовами деструктора и ухудшение производительность менее чем на 1%. Такие небольшие ухудшения производительности сложно даже измерить. Обработка редких ошибок с использованием возвращаемых значений требует дополнительных операций ветвления, которые, в реалистичных сценариях, замедляют программы примерно на 5%. Такой подход, кроме того, менее удобен, чем использование исключений. Если выбрасывается исключение, то на «раскрутку» каждого кадра стека тратится примерно 2 мкс.



C считается самым быстрым языком программирования. В C++ есть возможности, которые лишь повышают удобство работы, не влияя на производительность, в сравнении с C, и возможности, которые на производительность влияют. Эти возможности очень помогают в деле улучшения качества кода. В результате ими, несмотря ни на что, достаточно часто пользуются. Полиморфизм времени выполнения — это буквально вездесущая возможность, а вот исключения распространены меньше.
Читать дальше →

Агрегаты, мои агрегаты, как приятно о вас думать

Reading time7 min
Views33K

В Domain-Driven Design выделяют стратегические и тактические паттерны. Например, первые — это Единый язык, а вторые — Агрегаты. Я много раз слышал от коллег, что со стратегией всё понятно, но когда дело доходит до перехода на тактический уровень (до кода) — всё в тумане. Это приводит к некорректным техническим решениям, которые не могут компенсировать даже правильный настрой и близость к бизнесу. Для успеха проекта крайне важно освоить тактические паттерны, особенно Агрегаты. Всё потому, что Агрегаты инкапсулируют в себя почти всю бизнес-логику, это основа вашего приложения. В этой статье я и расскажу про Агрегаты, как они могут помочь и почему важно их освоить. Но...

...сперва антипаттерны

Изучаем RISC-V с нуля, часть 1: Ассемблер и соглашения

Reading time19 min
Views28K


Издеваться мы будем над микросхемой GD32VF103CBT6, являющейся аналогом широко известной STM32F103, с небольшим, но важным отличием: вместо ядра ARM там используется ядро RISC-V. Чем это грозит нам, как программистам, попробуем разобраться.


Кратко перечислю характеристики контроллера:


  • Напряжение питания: 2.6 — 3.6 В
    • Максимальная тактовая частота: 108 МГц
    • Объем ПЗУ (flash): 128 кБ
    • Объем ОЗУ (ram): 32 кБ
    • Объем Backup регистров (сохраняемых после сброса): 42 х 16 бит = 84 байта.
    • АЦП+ЦАП: 2 штуки АЦП по 10 каналов и 12 бит каждый плюс 2 ЦАП по 12 бит.
    • Разумеется, куча прочей периферии вроде таймеров, SPI, I2C, UART и т. д.

Как проходит собеседование начинающего разработчика на С++: что нужно знать и как подготовиться

Reading time6 min
Views40K

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

В этом посте я собрал подборку понятий, которые у вас могут спросить на собеседовании на вакансию Junior С++ разработчика, и описал, к чему в принципе вам стоит готовиться. Предупрежден — значит вооружен. Вкратце о себе: меня зовут Турмец, я работаю в Яндексе, параллельно учусь в Школе Анализа Данных и занимаюсь ревью кода на курсе «Разработчик С++» в Практикуме. 

Мы опустим, как именно попасть на собеседование и предположим, что вы уже интересны компании как потенциальный работник и у вас уже назначена дата интервью. 

Поехали.

Читать далее

Реверсим и улучшаем SATA контроллер

Reading time14 min
Views44K

Вы когда-нибудь задумывались, как много вокруг умной электроники? Куда ни глянь, натыкаешься на устройство, в котором есть микроконтроллер с собственной прошивкой. Фотоаппарат, микроволновка, фонарик... Да даже некоторые USB Type C кабели имеют прошивку! И всё это в теории можно перепрограммировать, переделать, доработать. Вот только как это сделать без документации и исходников? Конечно же реверс-инжинирингом! А давайте-ка подробно разберём этот самый процесс реверса, от самой идеи до конечного результата, на каком-нибудь небольшом, но интересном примере!

Читать далее

Information

Rating
Does not participate
Location
Херсон, Херсонская обл., Украина
Registered
Activity