Как стать автором
Обновить
-8
0
Иван Левашев @OCTAGRAM

Фрилансер

Отправить сообщение

Подсчёт ссылок не так прост, как кажется: опыт языка Umka

Время на прочтение6 мин
Количество просмотров4.1K

Подсчёт ссылок обычно предлагается как самый простой способ автоматического управления памятью в языках программирования. Он избавляет программиста от необходимости вставлять в свой код free(), delete и тому подобное, следить за висячими указателями и утечками памяти. Принцип действительно звучит очень просто: каждый выделенный в куче блок памяти наделяется счётчиком ссылок на него. Каждая переменная, через которую можно добраться до этого блока, олицетворяет одну ссылку. Блок освобождается тогда, когда счётчик ссылок доходит до нуля.

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

Итак, обсудим четыре ключевых практических проблемы, с которыми пришлось столкнуться при реализации подсчёта ссылок в языке Umka.

Читать далее
Всего голосов 18: ↑16 и ↓2+14
Комментарии51

Какие изменения нужны языку Rust, чтобы писать асинхронный код стало проще

Время на прочтение13 мин
Количество просмотров14K

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

Здесь я расскажу о некоторых ранее предложенных идеях и свяжу их с новыми предложениями. Я проведу некий мысленный эксперимент и постараюсь ответить на вопрос «Что мы могли бы сделать с асинхронным программированием в Rust, если бы нам дали полный карт-бланш?». 

Непродуманное внесение изменений в Rust может разрушить его. Поэтому всё нужно делать аккуратно, учитывая плюсы и минусы. Допускаю, что некоторые предложения могут вызвать негативную реакцию. Я отношусь к этому с пониманием и прошу читателя подойти к изучению этого материала максимально непредвзято.

Потоки vs Асинхронность


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

Например, этот echo server написан с использованием потоков. Он работает быстрее своей асинхронной версии — для случая, когда количество одновременных подключений не превышает 100.
Читать дальше →
Всего голосов 43: ↑41 и ↓2+39
Комментарии47

OLE, COM, COM+

Время на прочтение4 мин
Количество просмотров9.9K

Обратная разработка программного обеспечения — процедура получения информации об алгоритме. При этом получение этих данных напрямую зависит от того, насколько много есть информации о приложении в документации, и от того, какой использовался способ для создания файла. Всё еще больше усложняется, если алгоритм заимствует фрагменты из других приложений или операционной системы. Эта статья расскажет о механизмах, которые заложены в ОС Windows, благодаря которым процесс обратной разработки может стать весьма сложным процессом.

Читать далее
Всего голосов 9: ↑9 и ↓0+9
Комментарии15

Какие рефералки работают: с бонусами для себя, для того парня или для обоих? Исследование

Время на прочтение4 мин
Количество просмотров6.6K

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

Но какая программа сработает лучше: когда вам рассказывают, что выгоду получаете вы, ваш друг или вы оба? Это проверили исследователи в 2018 году.

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии5

Как правильно оформить Open Source проект

Время на прочтение7 мин
Количество просмотров53K

В свободное и не свободное время[1] я развиваю несколько своих проектов на github, а также, по мере сил, участвую в жизни интересных для меня, как программиста, проектах.


Недавно один из коллег попросил консультацию: как выложить разработанную им библиотеку на github. Библиотека никак не связана с бизнес-логикой приложения компании, по сути это адаптер к некоему API, реализующему определённый стандарт. Помогая ему, я понял что вещи, интуитивно понятные и давно очевидные для меня, в этой области, совершенно неизвестны человеку делающему это впервые и далёкому от Open Source.


Я провел небольшое исследование и обнаружил что большинство публикаций по этой теме на habrahabr освещают тему участия (contributing), либо просто мотивируют каким-нибудь образом примкнуть к Open Source, но не дают исчерпывающей инструкции как правильно оформить свой проект. В целом в рунете, если верить Яндекс, тема освещена со стороны мотивации, этикета контрибуции и основ пользования github. Но не с точки зрения конкретных шагов, которые следует предпринять.


Так что из себя представляет стильный, модный, молодёжный Open Source проект в 201* году?

Читать дальше →
Всего голосов 89: ↑84 и ↓5+79
Комментарии135

Открытие совместной магистратуры JetBrains и ИТМО

Время на прочтение2 мин
Количество просмотров19K
Компания JetBrains объявляет об открытии магистерской программы «Разработка программного обеспечения / Software Engineering» на базе Университета ИТМО. Приглашаем абитуриентов продолжить своё обучение и получить качественные знания в области программирования и компьютерных наук.

Учебная программа


Программа предлагает студентам актуальные знания в области разработки программного обеспечения. Базовые курсы (алгоритмы, программирование, машинное обучение и другие) дополнены специализированными предметами (глубокое обучение, информационный поиск, анализ изображений и другие), которые представляют современные подходы к решению задач IT-индустрии. Преподавательский состав программы включает в себя действующих учёных и разработчиков крупных компаний Петербурга.
Подробнее о магистратуре
Всего голосов 39: ↑39 и ↓0+39
Комментарии26

Ещё больше простых багов [язык Ада]

Время на прочтение7 мин
Количество просмотров7.9K

(Many) More Low Hanging Bugs


Примечание переводчика. На Хабре практически полностью отсутствуют публикации, связанные с языком Ада. А ведь это — живой язык, на котором пишут программы, для которого разрабатываются инструменты статического анализа. Чтобы хоть немного заполнить этот информационный вакуум на Хабре, я решил перевести небольшую заметку, связанную с данным языком. Почему её? В ней упоминается PVS-Studio, и мне это приятно :). Плюс, возможно, российские разработчики на языке Ada узнают о новом для себя инструментарии и увидят, что они совсем не одиноки, и жизнь продолжает кипеть в мире Ада.
Читать дальше →
Всего голосов 26: ↑24 и ↓2+22
Комментарии5

Обзор примитивов синхронизации — спинлоки и тайны ядра процессора

Время на прочтение5 мин
Количество просмотров54K
Последняя статья про классические примитивы синхронизации.

(Наверное, потом напишу ещё одну про совсем уже нетипичную задачу, но это потом.)

Сегодня мы немножко заглянем в процессор. Чуть-чуть.

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

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

На уровне процесса всё так и есть — различия между спинлоком и мьютексом — чисто технические, вопрос реализации и производительности.

Но меня эта тема интересует не только с позиции программиста юзерленда, но и с позиции разработчика ядра, а так же и разработчика самих примитивов синхронизации. И тут уже различие принципиально.

Дело в том, что внутри ядра мьютекс реализован с помощью спинлоков, а вот спинлоки реализованы сами по себе, автономно. Они — действительно базовый примитив. Ниже — только сам процессор.

Есть и ещё одно, семантическое различие. Мьютекс допускает и предполагает снятие нити с процессора, долгую остановку вызывающей нити. Мьютексом можно запереть объект на час или сутки, это приемлемо и нормально. Спинлок принципиально рассчитан только на кратчайшие приостановки, это всегда работа с неатомарным стейтом объекта. Присваивание группы переменных, небольшой цикл — это максимум того, что можно сделать под спинлоком.

Итак, иерархия реализации такова: mutex/cond/sema сделаны на базе спинлоков, спинлоки — на базе атомарных операций, предоставляемых процессором. Мы в них немного заглянем сегодня.

Как устроен спинлок?
Читать дальше →
Всего голосов 43: ↑41 и ↓2+39
Комментарии45

Обзор примитивов синхронизации — Семафор и немного lockless-а

Время на прочтение6 мин
Количество просмотров27K
В прошлой заметке мы обсудили самую известную пару из лагеря инструментов синхронизации тредов — mutex и cond. Сегодня встретимся с sema — примитивом, который умеет заменять предыдущие два в одиночку.

Но сначала — пара слов о случайных пробуждениях. (Спасибо xaizek, который мне об этом напомнил.) В принципе, строго реализованные механизмы синхронизации этим не страдают, но, тем не менее, опытный программист на это никогда не полагается.

Напомню фрагмент кода:

while(total_free_mem <= 0)
    {
    wait_cond(&got_free_mem, &allocator_mutex);
    }


Здесь цикл вокруг wait_cond гарантирует нам, что даже если мы вернёмся из ожидания события случайно или по ошибке, ничего страшного не случится — проверка в while обеспечит нам уверенность, что нужное состояние проверяемого объекта достигнуто. Если нет — поспим ещё в ожидании.

Отметим ещё раз, что проверяем мы состояние объекта (total_free_mem <= 0) при запертом мьютексе, то есть никто не может его менять в то же самое время.
Читать дальше →
Всего голосов 28: ↑27 и ↓1+26
Комментарии18

Обзор примитивов синхронизации — mutex и cond

Время на прочтение6 мин
Количество просмотров52K
Синхронизация нужна в любой малтитредной программе. (Если, конечно, она не состоит из локлесс алгоритмов на 100%, что вряд ли). Будь то приложение или компонента ядра современной операционной системы.

Меня всё нижесказанное, конечно, больше волнует с точки зрения разработки ядра ОС. Но почти всё применимо и к пользовательскому коду.

Кстати, ядра старых ОС в примитивах синхронизации не нуждались, поскольку преемптивной мультизадачности внутри ядра в старые добрые времена не было. (Уж за Юникс 7-й версии я отвечаю. Не было.) Точнее, единственным методом синхронизации был запрет прерываний. Но об этом позже.

Сначала перечислим героев. Мне известны следующие примитивы синхронизации:

User/kernel mode: mutex+cond, sema, enter/leave critical section.
Kernel only: spinlock, управление прерываниями.

Зачем всё это нужно, читатель, наверное, знает, но всё же уточним.

Если некоторая структура данных может быть доступна двум параллельно работающим нитям (или нити и прерыванию), и являет собой сущность, к которой нельзя обеспечить атомарный доступ, то работу с такой структурой нужно производить так, чтобы только одна нить одновременно выполняла сложные манипуляции с состоянием структуры.
Читать дальше →
Всего голосов 33: ↑27 и ↓6+21
Комментарии15

Lua что новенького в BitTorrent DHT?

Время на прочтение3 мин
Количество просмотров3K
Какое-то время назад я написал для Shareaza внешний DHT Tracker на Lua (GitHub). Для Shareaza это обычный локальный трекер, а по сути это BitTorrent DHT клиент, который позволяет ей качать торенты по магнет ссылкам без трекера.

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

Итак, что новенького мы наловили в BitTorrent DHT.
Читать дальше →
Всего голосов 26: ↑23 и ↓3+20
Комментарии10

Как правильно качать в p2p сетях или магнит с битрейтом

Время на прочтение3 мин
Количество просмотров29K
Раз уж пошла такая пляска, то и я расскажу про новый параметр магнет ссылки.

br=192000



В магнет-ссылке он выглядит так.

magnet:?dn=pop_music.mp3...&br=192000

Этот параметр позволяет совместить преимущества последовательного и случайного выбора частей для загрузки. Назовем это «смешанный способ выбора частей». Тем самым давая возможность «онлайн» просмотра/прослушивания без ущерба для скорости загрузки.
Подробности
Всего голосов 26: ↑23 и ↓3+20
Комментарии33

Новый параметр описания раздачи &x.do= в магнет-ссылке для FlylinkDC++. Факторы выбора юзером файлообменной сети

Время на прочтение5 мин
Количество просмотров11K
Прочитав заголовок статьи многие подумали, что первая часть не имеет никакого отношения ко второй части. Однако, ниже я приведу примеры которые показывают тесную взаимосвязь многих обстоятельств — и как итог выбор пользователем определённой файлообменной сети.
Читать дальше →
Всего голосов 14: ↑11 и ↓3+8
Комментарии62

Приручение файлообменных P2P сетей. DC (Direct Connect). Часть 2

Время на прочтение2 мин
Количество просмотров2.6K
С момента первой публикации программы MediaDC на этом сайте прошло не много времени, но уже сейчас можно сказать, что программа вызывает интерес.

Вкратце, программа представляет собой средство для просмотра файлов (фильмов, музыки, картинок) по протоколу DC (Direct Connect).
Таким образом, можно не скачивая оценить контент и избежать разочарования от потерянного времени на скачивание не интересного (в плохом качестве, etc) фильма.

Программа задумана для стирания грани между локальными файлами и файлами доступными в DC, по подобию обычной (SMB, Netbios шары).
Более детальное описание можно найти в моем первом посте Приручение файлообменных P2P сетей. DC (Direct Connect).

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

Читать дальше →
Всего голосов 12: ↑9 и ↓3+6
Комментарии11

EiskaltDC++. Первый релиз под номером 2.0

Время на прочтение2 мин
Количество просмотров3.6K
Совсем недавно состоялся первый релиз нововго DC++ клиента для Linux — EiskaltDC++ 2.0. Проект разрабатывается нашими соотечественниками и является прямым наследником EiskaltDC. Выход сразу версии 2.0 связан с тем, что был осуществлен переход на ядро dc++ (EiskaltDC был основан на dclib), код был полностью переписан, новый интерфейс основан на Qt4 и внешне максимально приближен к оригинальным клиентам DC++. В результате EiskaltDC++ стал представлять собой front-end на Qt4 для ядра dc++.
Читать дальше →
Всего голосов 24: ↑20 и ↓4+16
Комментарии21

Azure Service Fabric: вторые шаги

Время на прочтение12 мин
Количество просмотров7.9K

Снова Чарли Чаплин на фабрике в фильме «Новые времена»


Продолжаем разговор про Azure Service Fabric. В предыдущей статье я упомянул о планах написать сначала про stateful сервисы, а затем уже перейти к модели акторов в ASF. Концепция изменилась — подумалось мне, что неплохо бы для примеров использовать если уж не production-решение, то что-то близкое, чтобы была теоретическая польза и практический смысл. Можно объединить все компоненты ASF в одном флаконе — чтобы и корованы набигали, и лунапарк, и Винни-Пух и все-все-все. Вот с такими мыслями я и пошел на кладбище домашних проектов в поисках кандидата на оживление.


Читать дальше →
Всего голосов 14: ↑13 и ↓1+12
Комментарии10

Сжатый видеообзор свежей версии операционной системы BlackBerry 10

Время на прочтение1 мин
Количество просмотров16K
У нас недавно появилась возможность взглянуть на свежую версию операционной системы BlackBerry 10, установленную на устройство для разработчиков BlackBerry Dev Alpha. Поигравшись с системой, мы поняли, что это может быть интересно несколько большему кругу людей, а потому решили поделиться своим сжатым видеообзором об этой ОС.



В целом система работает довольно плавно, хотя в паре моментов наблюдались незначительные торможения. Вероятно, это из-за того, что гаджет, в кадре предназначен для разработчиков и не самый новый. Но некоторое мнение об ОС составить всё равно можно, а также увидеть удачные решения BlackBerry.

Приятного просмотра!
Всего голосов 18: ↑14 и ↓4+10
Комментарии16

DVD-RX, борьба с защитой

Время на прочтение3 мин
Количество просмотров11K
DVD-RX это многоуровневая защита DVD видео от несанкционированного копирования. Но раз есть информация которую можно просмотреть, значит её можно и сохранить. В этом посте я опишу то, как именно мне удалось снять образ с такого диска, при помощи Linux.
Читать дальше →
Всего голосов 39: ↑36 и ↓3+33
Комментарии10

OS Xак — мой опыт

Время на прочтение4 мин
Количество просмотров131K
Тема хакинтош — довольно занимательная штука, за которой я слежу и представляю себе «что там да как». Недавно назрела необходимость покупки нового PC домой. Ничего необычного, никаких супер компьютеров, самый середняковый компьютер для дома почитать новости, почту, посмотреть фотки, качнуть фильмец (ну или зачем там еще люди используют компьютер дома?). Вот тут то и закралась у меня мысль совместить приятное с приятным – собрать PC, максимально совместимый с OS X.
Собственно, своим опытом сборки Хакинтоша я и решил поделится в данном топике, всех кому это может быть интересно прошу под кат.
Читать дальше →
Всего голосов 84: ↑57 и ↓27+30
Комментарии97

Обратные сетевые эффекты — от чего умирают большие сети

Время на прочтение4 мин
Количество просмотров35K
Для успеха любой социальной сети жизненно важен сетевой эффект, который заключается в том, что ценность сети растёт с ростом количества участников. Согласно эмпирическому закону Меткалфа, полезность сети приблизительно равна половине квадрата численности участников. Тем не менее, сетевой эффект не является гарантией безоблачного существования крупной сети. Закон Меткалфа не помешал Facebook обойти Friendster и MySpace.

Сангит Пол Чодри — предприниматель, аналитик и бизнес-консультант из Сингапура — считает, что причиной смерти многих крупных сетей становятся так называемые обратные сетевые эффекты, из-за которых ценность сети не растёт, а уменьшается с ростом числа пользователей. Как они работают?
Читать дальше →
Всего голосов 32: ↑24 и ↓8+16
Комментарии17

Информация

В рейтинге
3 903-й
Откуда
Барнаул, Алтайский край, Россия
Дата рождения
Зарегистрирован
Активность