Pull to refresh
-8
0
Иван Левашев @OCTAGRAM

Фрилансер

Send message

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

Reading time6 min
Views4.1K

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

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

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

Читать далее
Total votes 18: ↑16 and ↓2+14
Comments51

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

Reading time13 min
Views14K

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

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

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

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


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

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

OLE, COM, COM+

Reading time4 min
Views9.9K

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

Читать далее
Total votes 9: ↑9 and ↓0+9
Comments15

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

Reading time4 min
Views6.6K

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

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

Читать далее
Total votes 5: ↑5 and ↓0+5
Comments5

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

Reading time7 min
Views53K

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


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


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


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

Читать дальше →
Total votes 89: ↑84 and ↓5+79
Comments135

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

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

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


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

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

Reading time7 min
Views7.9K

(Many) More Low Hanging Bugs


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

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

Reading time5 min
Views54K
Последняя статья про классические примитивы синхронизации.

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

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

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

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

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

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

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

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

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

Как устроен спинлок?
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments45

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Итак, что новенького мы наловили в BitTorrent DHT.
Читать дальше →
Total votes 26: ↑23 and ↓3+20
Comments10

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

Reading time3 min
Views29K
Раз уж пошла такая пляска, то и я расскажу про новый параметр магнет ссылки.

br=192000



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

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

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

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

Reading time5 min
Views11K
Прочитав заголовок статьи многие подумали, что первая часть не имеет никакого отношения ко второй части. Однако, ниже я приведу примеры которые показывают тесную взаимосвязь многих обстоятельств — и как итог выбор пользователем определённой файлообменной сети.
Читать дальше →
Total votes 14: ↑11 and ↓3+8
Comments62

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

Reading time2 min
Views2.6K
С момента первой публикации программы MediaDC на этом сайте прошло не много времени, но уже сейчас можно сказать, что программа вызывает интерес.

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

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

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

Читать дальше →
Total votes 12: ↑9 and ↓3+6
Comments11

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

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

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

Reading time12 min
Views7.9K

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


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


Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments10

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

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



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

Приятного просмотра!
Total votes 18: ↑14 and ↓4+10
Comments16

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

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

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

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

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

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

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

Information

Rating
Does not participate
Location
Барнаул, Алтайский край, Россия
Date of birth
Registered
Activity