В жизни нередко бывают ситуации когда нужно просто сесть и сделать какое-то дело, не забивая себе голову вопросами вроде "а что это даст?", "а кому это нужно?" и т. п. Написание монады IO —
безусловно именно такой случай. Поэтому под катом находится рассказ о том как написать монаду IO
на C#, без малейших попыток объяснить зачем это делать.
Рубрика «ненормальное программирование» - 70
Как написать монаду IO на C# (не) без помощи параллельной вселенной и машины времени
2016-05-04 в 10:41, admin, рубрики: C#, haskell, Вселенная, машина времени, монада IO, ненормальное программирование, функциональное программированиеРабота с WAV-файлами с использованием PHP
2016-05-04 в 8:56, admin, рубрики: composer, php, wav, waveform, ненормальное программированиеВсё началось с того, что я задумался о том, как отобразить на сайте информацию о загруженном аудио-файле. Для начала решил разобраться с самым простым форматом — wav. Как оказалось, ничего сложного в этом нет и писать именно об этом, в общем-то, не было бы никакого смысла, благо, информации о том, как устроен wav-файл «изнутри» в Интернете полно.
И тут Остапа понесло И тут в голову пришла светлая мысль о том, что было бы прикольно не просто отображать информацию о файле, но и иметь возможность генерировать такой файл «на лету». Думаю, все видели в сети всевозможные «онлайн-пианино» и прочее, верно?
Итак, что мне удалось сделать за 2 вечера — под катом.
Читать полностью »
Игра «Жизнь» в FPGA
2016-04-28 в 19:40, admin, рубрики: fpga, hdmi, игра жизнь, Марсоход3, ненормальное программирование, Параллелизм, параллельное программирование, ПЛИС, метки: Игра жизнь, параллелизмИгру жизнь — клеточный автомат уже кажется писали на всех возможных языках программирования.
Меня же интересует технология ПЛИС — и поэтому когда-то я сделал реализацию life для ПЛИС Альтера Cyclone III. Правда поместилось в чип тогда очень мало: всего 32x16 клеток. На таком маленьком поле довольно трудно испытать сложные фигуры.
Сейчас у меня в руках другая плата: тут уже стоит Altera MAX10 с 50-ю тысячами логических элементов. Было интересно, смогу ли я расширить поле хотя бы в 4 раза? В общем задумал сделать хотя бы 64x32.
Результат представлен на этом видео, я называю эту картину: «ружье Госпера убивает самоё себя».
Ниже подробности реализации.Читать полностью »
За что ругают Golang и как с этим бороться?
2016-04-27 в 9:31, admin, рубрики: Go, golang, ненормальное программирование, ооп, Программирование, разработка приложений Написав несколько проектов на Go, я оглянулся назад. Посмотрел на язык, на его плюсы и минусы. В этой статье хотелось бы поговорить о том, за что критикуют Go. Конечно же, речь пойдет об отсутствии ООП как такового, перегрузки методов и функций, обобщенного программирования и исключений. Действительно ли это доставляет столько проблем? Или это проблема подхода разработки? Я поделюсь своим опытом решения этих вопросов.
Читать полностью »
Garbage Collector & C++
2016-04-26 в 20:44, admin, рубрики: c++, C++ GC memory, ненормальное программирование, метки: C++ GC memoryРучное управление памятью с С++ — одновременно один из самых больших плюсов и минусов в языке. Действительно, эта парадигма позволяет создавать очень производительные программы, однако она же рождает и кучу проблем. Существует несколько способов избавится от них. Я попробовал несколько и в итоге пришел к сборщику мусора. В этой статье я хочу изложить не столько реализацию сборщика мусора на С++, сколько историю идеи и его использования, каково им пользоваться и почему в итоге от него отказался.
Преемптивность: как отнять процессор
2016-04-20 в 14:19, admin, рубрики: многозадачность, многопоточность, ненормальное программирование, нити, программирование микроконтроллеров, системное программирование, шедулерЭта статья не имеет смысла без предыдущей, в которой описывались основные механизмы переключения контекстов в многозадачной ОС.
Здесь я расскажу, как кооперативная многозадачность превращается во враждебную преемптивную.
Суть этого превращения проста. В машине есть таймер, таймер генерирует прерывания, прерывания приостанавливают код нити и отдают процессор в руки механизма многозадачности. Оный уже вполне кооперативно переключает процессор на новую нить, как и описано в предыдущей статье.
Но, как обычно, есть нюансы. См. код для интела.
Сам «отъём» процессора делается как в рамках обычного хардверного прерывания, обычно — по таймеру, так и в рамках «софтверного» прерывания — которое, собственно, такое же прерывание, но вызванное специальной инструкцией процессора. Такой способ переключения контекста нужен, если мы (например, в рамках примитива синхронизации) явно останавливаем нить и не хотим ждать, пока прилетит таймерное прерывание.
Читать полностью »
Делаем мультизадачность
2016-04-20 в 12:25, admin, рубрики: многозадачность, многопоточность, ненормальное программирование, программирование микроконтроллеров, системное программированиеЯ стараюсь чередовать статьи про разработку ОС вообще и специфические для ОС Фантом статьи. Эта статья — общего плана. Хотя, конечно, я буду давать примеры именно из кода Фантома.
В принципе, реализация собственно механизма многозадачности — довольно простая вещь. Сама по себе. Но, во-первых, есть тонкости, и во-вторых, она должна кооперироваться с некоторыми другими подсистемами. Например, та же реализация примитивов синхронизации очень тесно связана с реализацией многозадачности. Есть небанальная связь так же и с подсистемой обслуживания прерываний и эксепшнов. Но об этом позже.
Начнём с того, что есть два довольно мало связанных модуля — собственно подсистема переключения задач (контекстов) и подсистема шедулинга. Вторую мы сегодня обсуждать почти не будем, просто опишем кратко.
Шедулер — это функция, которая отвечает на вопрос «какой нити отдать процессор прямо сейчас». Всё. Простейший шедулер просто перебирает все нити (но, конечно, готовые к исполнению, не остановленные) по кругу (RR алгоритм). Реальный шедулер учитывает приоритеты, поведение нити (интерактивные получают больше, чем вычислительные), аффинити (на каком процессоре нить работала в прошлый раз) и т.п., при этом умеет сочетать несколько классов приоритетов. Типично это класс реального времени (если есть хотя бы одна нить этого класса — работает она), класс разделения времени и класс idle (получает процессор только если два предыдущих класса пустые, то есть в них нет нитей, готовых к исполнению).
На сём пока про шедулер закончим.
Перейдём к собственно подсистеме, которая умеет отнять процессор у одной нити и отдать его другой.
Читать полностью »
Я не знаю как это сделать! Честно-честно
2016-04-14 в 23:07, admin, рубрики: ненормальное программирование, обучение программированию, Программирование, психология программирования, пятничный пост, управление разработкой Это статья о простом приеме мотивации молодого специалиста. Если коротко: сильный специалист признается, что не знает как решить задачу, что бы мотивировать новичка. О паре случаев из жизни под катом.
Читать полностью »
Разработка для коптеров
2016-04-14 в 9:38, admin, рубрики: python, дрон, квадрокоптер, мультикоптеры, ненормальное программирование, Разработка робототехникиВ последнее время коптеры из игрушек и летающих камер становятся Большим Бизнесом. Коптеры доставляют грузы, делают съемку местности, охраняют периметр, распыляют химикаты в полях и даже красят, в общем выполняют разного рода задания. Разумеется большинство действий делаются не вручную, с пульта, а выполняются программно.